我明白,整數下溢和溢出未定義。爲什麼C++下溢/溢出行爲被認爲是未定義的?
但是,考慮到C++最終編譯爲程序集,是不是實際定義的行爲?
按位表示保持不變,整數格式保持不變0111..11總是會翻轉到1000..00,對於下溢也是如此,那麼爲什麼它不被視爲定義的行爲?
關於大會彙編,我是從我們被教導在學校簡陋的組裝,但是所代碼塊給
int x = INT_MAX;
int y = x+1;
編譯成
00401326 movl $0x7fffffff,0x8(%esp)
0040132E mov 0x8(%esp),%eax
00401332 inc %eax
00401333 mov %eax,0xc(%esp)
現在,無論x的值,不會總是有公司或增加指令?那麼,未定義的行爲在哪裏出現?
這個問題很有趣,但我認爲你應該添加這兩種情況下的C++編碼示例,以及編譯器爲這些情況中的每一種生成的解構程序。 –
我必須同意@barakmanos – MZaragoza
它在C++中是未定義的,因爲世界上的各種CPU不同意定義。例如,某些CPU使用「飽和」數學,其中溢出導致最大值。 –