一个人应该怎么做才能发现他们的系统对溢出条件的响应?描述一种人们可以测试他们的系统对下溢条件的响应的方法。
我理解什么是溢出和下溢,我在维基百科上查过,但我不明白如何从系统到系统进行测试。
一个人应该怎么做才能发现他们的系统对溢出条件的响应?描述一种人们可以测试他们的系统对下溢条件的响应的方法。
我理解什么是溢出和下溢,我在维基百科上查过,但我不明白如何从系统到系统进行测试。
使用无符号整数,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
int main()
{
int i = 0;
while(1)
{
i++;
}
}
int is_overflow (char a, char b, char res)
{
char mask = (1<<(8*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语言中测试这些标志的可移植方式。
INT_MAX + 1 > INT_MAX
简化为true(1
),而不实际执行计算。 - Keith Thompsonsizeof(char)
定义为 1,所以你的掩码始终为 1,你的代码没有检查溢出,而是检查函数参数是奇数还是偶数的奇怪组合。 - Art#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;
}
UINT_MAX + 1 == 0
。 - Keith Thompson
N + 1.0 == N
,你就会陷入无限循环。 - Keith Thompson