给出这个简单的代码片段:
#include <stdio.h>
#include <stdint.h>
int main() {
int8_t a = -1;
printf("Dec: %d, Hex: %hhx\n", a, a);
int8_t b = a + 1;
printf("Dec: %d, Hex: %hhx\n", b, b);
return 0;
}
结果是:
Dec: -1, Hex: ff
Dec: 0, Hex: 0
这是有道理的,看起来我的系统正在使用二进制补码来实现负整数。
但现在我的问题是
a
是一个8位有符号整数。当 0xff
加 1 时,应该会导致整数溢出。根据这个问题,有符号整数溢出是不是定义的行为。
因此,我的问题是加法如何适用于 8 位负整数,以避免未定义的行为。
和整数提升有关系吗?如果是这样,请解释它在底层是如何工作的。
谢谢你。
无符号整数不会溢出,只会环绕。当您分析二进制补码在幕后如何工作时 - 您分析的是无符号整数。
当有符号整数的值大于最大或最小有符号值存储到该整数时,就会发生上溢(或下溢)。
对于
int8_t
,这些值为 -128
和 127
。所以当你想加或减 1
时,只有 -128 - 1
或 127 + 1
才会导致溢出。 -1 + 1
没有。