一个人可以做些什么来了解他们的系统如何响应溢出情况?描述一个人可以测试他们的系统如何响应下溢情况的方式。
我确实理解溢出和下溢是什么,我在维基百科上查了一下,但我不明白它是如何在系统之间进行测试的。
答案 0 :(得分:2)
对于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
答案 1 :(得分:1)
假设你的意思是c。像
这样的东西 int main()
{
int i = 0;
while(1)
{
i++;
}
}
轻型保险丝并且能够很好地支撑
答案 2 :(得分:0)
您可以尝试这样的事情:
#include <stdio.h>
#include <limits.h>
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;
}
答案 3 :(得分: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中测试这些标志的可移植方式。