弄C++很多年了,沒想到還居然被這種問題所困,其實(shí)不光我了,問了幾個(gè)同道中人,都未能很好解釋為什么,不過我還是記錄一下,有知情人士看到的話不妨留言告知。
代碼是hello world級(jí)別的,很簡單:
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;
}
問題:輸出結(jié)果是什么?
我預(yù)期的輸出結(jié)果應(yīng)該是這樣:
-50
-100
-25
-25
而事實(shí)上是:
-50
-100
2147483623
-25
在VC6,VS2005和VS2008上調(diào)試過,結(jié)果完全一致,這就表示,(ni-ui)/2的結(jié)果被認(rèn)為是一個(gè)無符號(hào)整型,為什么會(huì)這樣呢?我看了一下反匯編……其實(shí),我沒看明白。(匯編沒學(xué)好)
這種小問題可能會(huì)引發(fā)大問題,我最近在設(shè)計(jì)一個(gè)程序,把圖片貼到窗口上,圖片的寬和高被我設(shè)計(jì)為無符號(hào)的,因?yàn)閷捄透咦钚?,不可能是負(fù)數(shù),而圖片的繪制位置則有可能是負(fù)數(shù),這跟坐標(biāo)系有關(guān),這樣有符號(hào)和無符號(hào)之間就有可能出現(xiàn)了上面的那種操作,導(dǎo)致程序出現(xiàn)了一些怪異的行為,通過調(diào)試,發(fā)現(xiàn)是這個(gè)問題。
解決方法很簡單,只要加上一個(gè)強(qiáng)制轉(zhuǎn)換即可,像代碼最后一個(gè)printf語句那樣。但為什么這樣我就不太清楚了,是C++的規(guī)范,還是編譯器的問題,有其它編譯器的朋友可以試試看。