C中的溢出和下溢

时间:2014-01-22 01:10:01

标签: c

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

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

4 个答案:

答案 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中测试这些标志的可移植方式。