int main()
{
int y=2147483647;
printf("%d\n",!(~y+~y));
}
Когда я компилирую его с помощью gcc и запускаю в Ubuntu, результат равен 0. Но когда я компилирую и запускаю его на vs2022, результат равен 1. Я не могу понять, как появился результат 0.
Даже без неопределенного поведения, почему вы не понимаете результат 0
? Я не понимаю, как это может быть 1
. Добавление того же (ненулевого) числа не приведет к 0
, поэтому, если !
впереди, это не будет 1
, например, должно быть 0
.
Побитовая инверсия десятичного значения 2147483647
/0x7FFFFFFF
в конечном итоге будет равна 0x80000000
. В системе дополнения до 2, такой как ваша, это эквивалентно -2147483648
.
-2147483648
+ -2147483648
дает арифметическое недополнение signed int
, это неопределенное поведение, и может случиться что угодно. На практике во время оптимизации компилятор может либо принять решение, что ~y+~y
равно нулю, либо что оно равно не нулю, это не точно определено.
Исправьте это, переключив все типы на int64_t
/PRIi64
(#include <inttypes.h>
).
Это неопределенное поведение.