弄C++很多年了,沒想到還居然被這種問題所困,其實不光我了,問了幾個同道中人,都未能很好解釋為什么,不過我還是記錄一下,有知情人士看到的話不妨留言告知。
代碼是hello world級別的,很簡單:
int _tmain(int argc, _TCHAR* argv[])
{
int ni = 50;
unsigned int ui = 100;
printf("%d\n", ni-ui);
printf("%d\n", (ni-ui)*2);
printf("%d\n", (ni-ui)/2);
printf("%d\n", (ni-(int)ui)/2);
return 0;
}
問題:輸出結果是什么?
我預期的輸出結果應該是這樣:
-50
-100
-25
-25
而事實上是:
-50
-100
2147483623
-25
在VC6,VS2005和VS2008上調試過,結果完全一致,這就表示,(ni-ui)/2的結果被認為是一個無符號整型,為什么會這樣呢?我看了一下反匯編……其實,我沒看明白。(匯編沒學好)
這種小問題可能會引發大問題,我最近在設計一個程序,把圖片貼到窗口上,圖片的寬和高被我設計為無符號的,因為寬和高最小為0,不可能是負數,而圖片的繪制位置則有可能是負數,這跟坐標系有關,這樣有符號和無符號之間就有可能出現了上面的那種操作,導致程序出現了一些怪異的行為,通過調試,發現是這個問題。
解決方法很簡單,只要加上一個強制轉換即可,像代碼最后一個printf語句那樣。但為什么這樣我就不太清楚了,是C++的規范,還是編譯器的問題,有其它編譯器的朋友可以試試看。