Скажем, я хочу напечатать некоторые значения. Я предполагаю, что я должен получить Integer Overflow, если моя подписанная переменная превышает от TMin
и TMax
(в этом случае, используя 4 байта int, 0x7FFFFFFF
как Tmax
и 0x80000000
как Tmin
), но в этом примере я не получаю то, что ожидаю (объяснено в комментарии):Не получать Integer Overflow
// Tmax = 0x7FFFFFFF == 2147483647
// Tmin = 0x80000000 == -2147483648
printf("1- overflow test: %d\n", 0x7FFFFFFF+1); // overflow - how compiler finds out it's a signed value, not an Unsigned one
printf("2- overflow test: %d\n", 0x80000000-1); // in contrast, why I am not getting an integer overflow here
printf("3- overflow test: %d\n", (int) 0x80000000-1); // overflow (Expected)
printf("4- overflow test: %d\n",(int) (0x7FFFFFFF+1)); // overflow (Expected)
Первый - вы используете подписанное форматирование. Второй - литерал вычисляется во время выполнения, поэтому переполнение не происходит. В любом случае, подписанные переполнения не определены. – TNW
@TNW выражение во времени компиляции рассчитывается как '0x7FFFFFFF + 1'. –
@TNW, так почему существует отличное поведение для # 1 по сравнению с # 2 (так как синтаксис выглядит одинаково для меня) – Yar