Результат (int) -2147483648, деленный на (int) -1, используя разные компиляторы?

Как мы все знаем, наименьшее целое число зависит от компилятора, поэтому у меня есть этот вопрос: каков результат (int) -2147483648 , деленный на (int) -1 вы получаете, когда используете разные компиляторы? Например, VC6.0, VS2010 и т. Д.?

2
nl ja de
добавлено автор Bo Persson, источник
На x86/x86_64 вы обычно получаете исключение с плавающей запятой, когда вы это делаете.
добавлено автор Daniel Fischer, источник
@Mat это не реализация. Неопределенное поведение: INT_MIN/-1 - неопределенное поведение из-за 6.5.5p5 в c99.
добавлено автор ouah, источник
Кстати, я не могу понять, почему этот вопрос был закрыт. Если кто-то ошибочно полагает, что это разделение определяется реализацией, я думаю, что вопрос должен быть вновь открыт.
добавлено автор ouah, источник
@Mat извините 6.5p5, а не 6.5.5p5.
добавлено автор ouah, источник
Зачем тебе это нужно знать? Поведение не определено, поэтому вы никогда не должны пытаться в первую очередь, и компиляторы не обязаны давать согласованные результаты.
добавлено автор Raymond Chen, источник
Умножение или деление не имеет значения. Результатом является реализация, определенная, если результат арифметической операции над подписанными ints не является представимым. Реализация может определить результат или поднять сигнал. (По крайней мере, в C99, cf §6.3.1.3.) Вам нужно будет посмотреть в документах компилятора Microsoft.
добавлено автор Mat, источник
@ouah: Я не вижу, что указано в 6.5.5/5, только деление на ноль (но я действительно думал, что конкретный случай не определен ...). И соглашайтесь с вами, я не понимаю, почему это было закрыто. (Возможно, там есть дубликат.)
добавлено автор Mat, источник
из любопытства: зачем вам пытаться делить ? Да, в этом случае то же самое, но я бы никогда не думал о том, чтобы делать отрицание с делением, а не с умножением.
добавлено автор stefan, источник

1 ответы

Сначала предположим, что мы находимся в 32-битной системе с двумя представлениями дополнения, где INT_MIN значение совпадает с -INT_MAX - 1 .

Это выражение:

(int) -2147483648/(int) -1

эквивалентно

(int) -2147483648/-1

поскольку -1 уже имеет тип int .

В системе дополнений 32-bit , где INT_MAX находится 2147483647 , значение 2147483648 имеет тип long 1) , поскольку он не может быть представлен в int . Значение -2147483648 также имеет тип long .

Значение long -2147483648 может быть представлено в int , а значение после целочисленного преобразования (int) -2147483648 является INT_MIN .

Исходное выражение тогда эквивалентно (по нашим предположениям):

INT_MIN/-1

and this expression эквивалентно INT_MAX + 1 which is not representable in an int. Indeed int type range goes from INT_MIN to INT_MAX. The expression is an integer overflow and integer overflow invokes undefined behavior in C.

(C99, 6.5p5) «Если при оценке выражения возникает исключительное условие (то есть, если результат не определен математически или нет в диапазоне представляемых значений для его типа), поведение не определено. «


1) We implicitly assume LONG_MAX is > INT_MAX, otherwise the value 2147483648 is of type long long.

1
добавлено
6.3.1.3 (1): «Когда значение с целым типом преобразуется в другой целочисленный тип, отличный от _Bool , если значение может быть представлено новым типом, оно не изменяется». Обычно значение (int) -2147483648 не определено реализацией [за пределами определения реализации размеров и представлений целочисленного типа] и приводит к INT_MIN . Только если ширина int меньше 32 бит или представление не является дополнением двух, или значение со знаком-битом 1 и всеми битами значения 0 является представлением ловушки, это может быть нечто иное, чем -2147483648 .
добавлено автор Daniel Fischer, источник
@ DanielFischer, черт возьми, я пропустил пункт во второй части моего ответа. Конечно, -2147483648 представляется в int , и это действительно INT_MIN , я не знаю, о чем я думал. Спасибо, я редактирую это.
добавлено автор ouah, источник
pro.cxx
pro.cxx
3 049 участник(ов)

C/C++ chat 0. Простые вопросы, лабы и о IDE — в чат новичков @supapro 1. Не хамим, не переходим на личности, не вбрасываем утверждения без доказательств 2. No Ads, offtop, flood Объявления о вакансиях и евенты - в лс @AlexFails https://t.me/ProCxx/259155

supapro.cxx
supapro.cxx
1 925 участник(ов)

Чат для тех, кто немного знает C++, простые вопросы по реализации, синтаксису и ide – сюда, а для другого есть: /Главный чат по серьезным вопросам — @ProCxx /Чат по обсуждению всего — @fludpac

C++ Russia
C++ Russia
384 участник(ов)

Сообщество разработчиков C++ в Telegram.

cxx.Дискуссионная
cxx.Дискуссионная
298 участник(ов)

это не двач, общайтесь вежливо; разговор на почти любые темы; Не согласны с баном? В лс @AlexFails, @ivario

C++ для маленьких и тупых
C++ для маленьких и тупых
105 участник(ов)

Лоу левел (по среднему IQ участников) чатик ExtremeCode @extremecode Флудилка @extremecode_rest