2016-12-29 127 views
0

我已经做了多次签名溢出,但每次都是turbo c wraparound。 例如:为什么turbo c环绕有符号整数溢出每次虽然有符号整数溢出未定义?

#include <stdio.h> 

void main() { 
    int i = 100000; 
    printf("%d", i); 
    getch(); 
} 

输出是-31072这是预期输出,如果环绕完成。 二进制100000(dec)11000011010100000,最后16位是存储,其中 是1000011010100000。在两个补码表示1000011010100000-31072

+0

看看[this](https://www.youtube.com/watch?v=yG1OZ69H_-o)。它很好地解释了未定义的行为,更具体地讨论了未定义的行为以及我们有时使用夸张来描述它的方式。 – wally

回答

2

你的例子没有包含任何签名溢出,所以没有未定义的行为。

(假设INT_MAX小于100000)

分配:

int i=100000; 

执行从一个类型的长期,这是整数常量100000的类型的隐式转换,为int类型。该转换结果是实现定义的(或实现定义的陷阱是信号)。


(引自:ISO/IEC 9899:201X 6.3.1.3符号和无符号的整数3)
否则,新的类型是有符号和值不能在它来表示; 结果是实现定义的或者实现定义的信号被引发。