C中的溢出和下溢

一个人可以做些什么来了解他们的系统如何响应溢出情况? 描述一个人可以测试他们的系统如何响应下溢情况的方式。

我确实理解溢出和下溢是什么,我在维基百科上查了一下,但我不明白它是如何在系统之间进行测试的。

假设你的意思是c。 就像是

  int main() { int i = 0; while(1) { i++; } } 

灯保险丝,站好后面

对于unsigned整数,C要求下溢和溢出以某种方式运行。 例如,请考虑以下事项:

 unsigned int uintUnderflow = 0; unsigned int uintOverflow = UINT_MAX; printf("%u\n", --uintUnderflow); // Guaranteed to be UINT_MAX printf("%u\n", ++uintOverflow); // Guaranteed to be 0 

现在使用有signed整数,实现可以定义下溢和溢出,但是他们希望如此。 这是未定义行为的本质。 如果你找不到它的表现方式,你必须自己试验一下:

 int intUnderflow = INT_MIN; int intOverflow = INT_MAX; printf("%d\n", --intUnderflow); // Implementation defined printf("%d\n", ++intOverflow); // Implementation defined 

你可以尝试这样的事情:

 #include  #include  int main() { int n = INT_MAX; ++n; printf("INT_MAX + 1: %d\n", n); unsigned u = UINT_MAX; ++u; printf("UINT_MAX + 1: %u\n", u); n = INT_MIN; --n; printf("INT_MIN - 1: %d\n", n); u = 0; --u; printf("0u - 1: %u\n", u); return 0; } 

对于以2补码编码的整数,有一种方法可以在加法运算后检测溢出:检查两个操作数和结果的符号。 如果操作数具有相同的符号但结果没有,则存在溢出。

 int is_overflow (char a, char b, char res) { char mask = (1<<(sizeof(char)-1)); if ((a & mask) == (b & mask) && (a & mask) != (res & mask)) return 1; else return 0; } 

例如:

 char a = 127; char b = 1; char c = a + b; is_overflow (a, b, c) => 1 char a = -128; char b = -1; char c = a + b; is_overflow (a, b, c) => 1 char a = -1; char b = 1; char c = a + b; is_overflow (a, b, c) => 0 char a = 1; char b = 1; char c = a + b; is_overflow (a, b, c) => 0 

对于下溢,事情是不同的。 我不知道整数下溢,但浮点下溢。 对于这些情况,数字处理器有标志来测试上一次操作是否下溢,但我不知道从C中测试这些标志的可移植方式。