int main()
{
int x = <a number>
int y = <a number>
unsigned int v = x;
unsigned int w = y;
int ssum = x * y;
unsigned int usum = v * w;
printf("%d\n", ssum);
printf("%d\n", usum);
if(ssum == usum){
printf("Same\n");
} else {
printf("Different\n");
}
return 0;
}
有以下代碼,將打印的是什麼?難道是因爲等於符號和無符號,如果你有一個像-1負,當它被分配給int x
成爲0xFF的,而且會產生相同的結果,那麼,如果你想要做1 +( - 1),如果你以簽名的方式得到-2 = 0xFE,並且由於無符號變量將被設置爲0xFF,所以如果添加它們,您仍然可以獲得0xFE。對於2 +(-3)或-2 + 3也是如此,最後十六進制值是相同的。那麼在C中,當它看到signedSum == unsignedSum時會看到什麼?它不關心一個實際上是一個大數目,另一個是-2,只要1和0是相同的?
是否存在將使這不是真的任何價值?
號,C是相反的,它看起來什麼值表示,不關心1和0。 '-1 + -1'總是'-2' – 2015-02-06 23:02:54
注意* signed overflow *是**未定義的行爲**。你會經常閱讀它,但是你不能**依靠這個。另一方面,無符號*溢出是明確的二進制補碼環繞。 – EOF 2015-02-06 23:06:40
@EOF:*幾乎*正確。無符號算術的環繞與2的補碼無關。 (嚴格來說,它不是「溢出」。) – 2015-02-06 23:22:00