我搜索了文檔,但找不到任何解釋。爲什麼溢出結果爲0?
我有一個d程序:
import std.stdio;
void main() {
writeln(int.max);
int a = 2;
int b = 180;
writeln(a^^b);
}
它寫道:
2147483647
0
我溢出int
,而是獲得垃圾或包裹,我得到0
。
如果我使用real
或double
,顯然輸出是正確的。
我寫了一個程序進行實驗,這在C(不是C是d,但d編譯爲本地代碼和C是可移植的彙編程序,所以他們應該是相當的):
#include <stdio.h>
#include <math.h>
#include <limits.h>
int main(void) {
double i = pow(2, 128);
int j = (int) i;
printf("int max: %d\n", INT_MAX);
printf("print dbl as int: %d\n", i);
printf("cast dbl -> int: %d\n", j);
printf("double: %f\n", i);
return 0;
}
它提供:
int max: 2147483647
print dbl as int: -1254064128
cast dbl -> int: -2147483648
double: 340282366920938463463374607431768211456.000000
第二行和第三行線很少會發生同樣的事情兩次,因爲我相信這是不確定的行爲,這是一點。
我知道D想成爲一個更好的C,並且一種方法是消除未定義的行爲。但是,如果D是系統編程語言(它甚至有內聯asm
),爲什麼D拒絕在溢出時換行?
只需要注意一下:C中兩行不正確的點有意未定義/不正確,以證明我期待的結果。但是,現在我明白了,非常感謝。 – cat
「它將重新解釋將這些位轉換爲int」 - 在C中,它是*未定義的行爲*。結果(如果有的話)可能與輸入不相似,例如,在常見的64位系統上,使用不同於整數值的寄存器將浮點值傳遞給printf –
是的,當然,這就是爲什麼它是如此隨機! –