溢出:我只想知道计算机如何纠正溢出

时间:2014-08-07 10:31:24

标签: c overflow

我构建了这些代码并知道溢出不会影响下一个地址(= ptr + 1)。

void main(void)
{
    unsigned short int over = 0;
    unsigned short int *ptr = &over;
    printf("%x", over);
    over = 0xffff0fff;

    printf("%x", *(ptr + 1));
}

所以,我只是想知道计算机如何纠正溢出。 我以为CPU削减了溢出的位。是对的吗? 如果是,请告诉我CPU如何切断溢出的位。 谢谢:))

2 个答案:

答案 0 :(得分:0)

溢出是在某些数据上执行某些操作后发生的错误,超过分配的大小。例如:

char a[] = {0xFF, 0x00};
a[0] = a[0] + 0x02;

这里我分配了一个2字节的内存块(char通常是1字节)。在第一个字节中,我放置值0xFF,在第二个字节中放置0x00。在第二行,我执行加法0xFF + 0x02,其结果为0x101。它需要至少9个字节来表示,并将其分配给只有8位可用的变量。因此,第一位被丢弃,[0]的值为0x01。当然,1仍然是0x00。

因此,溢出没有得到纠正。由于溢出,a [0]的值是错误的。但它的影响有限(1不受影响)。这就是溢出意味着什么。删除了一些位并且值已损坏。

还有另一种溢出,不涉及任何截断。大多数签名数据类型都使用two's complement。我将简化这一点,我会说最重要的位用作符号位:对于负数,它是1,对于正数,它是0.对于有符号的字符,最高正数可以是0x7F (127)。如果你向它添加0x01,你将得到0x80。没有截断,但是,由于溢出,它的值是-128。

谈到你的代码:

  • 您没有为*(ptr + 1)分配值,因此存在垃圾,您无法判断它是否受到影响。
  • 你的价值被截断了。这很容易发现,问题是在某些计算过程中发生溢出时。

答案 1 :(得分:0)

溢出意味着将数据分配到它可以容纳的范围之外。它通常定义为undefined behaviour  我可以举个例子

unsigned char c=300;//unsigned char can hold up only upto 255,this assignment is called overflow.

溢出在C中通过在该数据类型的范围内为其分配随机值来表示。  实施例

unsigned char c=300;//will assign c with a value between 0 to 255 randomly
char c=300;//will assign c with a value between -127 to 128 randomly

这类似于int,float any数据类型。

我只是想知道计算机如何纠正溢出 - 可能你现在已经知道如何处理溢出。  如果char溢出,则其值将是未定义的并且将在分配给它的相同内存中示例1 BYTE.Overflow并不意味着其值将占用与其相邻的内存位置。该值将在其数据类型分配给它的内存中设置。