2016-12-29 123 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)
否則,新的類型是有符號和值不能在它來表示; 結果是實現定義的或者實現定義的信號被引發。