> ты внимательней прочти, а потом РТФэкай > а так же скомпилируй 32 а потом 64 и почувствуй разницу. > > __int64 f(__int64 i, unsigned __int64 ui) { > __int64 r = i / ui; > return r; > } > int main() { > f(-6, 3); > return 0; > }
Компилятор преобразовал -2 в uint64_t (это правильно, см ссылку) получилось 0xFFFF_FFFF_FFFF_FFFE, потом поделил это на 2, результат = 0x7FFF_FFFF_FFFF_FFFF.
кто обяснит сиё , на 64bit компайлере вот такая поганка:
l64 - signed 64bit отрицательное число (например -2) делим на положительное unsigned число к примеру 2
компайлер считает что -2 ето unsigned и делит как unsigned и на выходе фигня = 0x7fffffffffffffff
long long l64 = -2
long long res = l64 / sizeof(short);
?
Могу ошибаться, но, вроде бы как в стандарте не стандартизовано неявное приведение типов. Каламбурчик — но суть, думаю ясна. И решение где-то рядом с long long res = l64 / (long long) sizeof(short);07.03.12 08:18 Автор: kstati <Евгений Борисов> Статус: Elderman
попробуй прописать директиву для 64-х битной модели, заменить __int64 на int, скомпилировать и посмотреть что получится.
похоже на ошибку оптимизации с тупым сдвигом регистра. есть возможность отключить оптимизацию вычислений?29.02.12 01:50 Автор: Den <Денис Т.> Статус: The Elderman
> кто обяснит сиё , на 64bit компайлере вот такая поганка: > l64 - signed 64bit отрицательное число (например -2) делим > на положительное unsigned число к примеру 2 > компайлер считает что -2 ето unsigned и делит как unsigned > и на выходе фигня = 0x7fffffffffffffff > long long l64 = -2 > long long res = l64 / sizeof(short); > ?
> ты внимательней прочти, а потом РТФэкай > а так же скомпилируй 32 а потом 64 и почувствуй разницу. > > __int64 f(__int64 i, unsigned __int64 ui) { > __int64 r = i / ui; > return r; > } > int main() { > f(-6, 3); > return 0; > }
Компилятор преобразовал -2 в uint64_t (это правильно, см ссылку) получилось 0xFFFF_FFFF_FFFF_FFFE, потом поделил это на 2, результат = 0x7FFF_FFFF_FFFF_FFFF.
Итого = всё правильно.
а ну объясни, почему 32 битный компайлер генерит другой код...01.03.12 07:47 Автор: + <Mikhail> Статус: Elderman Отредактировано 01.03.12 07:51 Количество правок: 2