另外,當(dāng)在無(wú)符號(hào)數(shù)和有符號(hào)數(shù)之間進(jìn)行類型轉(zhuǎn)換時(shí),不同的轉(zhuǎn)換順序會(huì)得到不同的結(jié)果。如:
1
2 unsigned x = 0xFFFF;
3 (int) ((word << 24) >> 24);
4 ((int) word << 24) >> 24;
第一個(gè)表達(dá)式的結(jié)果是0xFF,而第二個(gè)是0xFFFFFFFF.原因是第一個(gè)表達(dá)式的右移運(yùn)算高位補(bǔ)0,而第二個(gè)右移運(yùn)算高位補(bǔ)1.
測(cè)試代碼:
1 #include
2 #include
3 float sum(float a[], unsigned int len)
4 {
5 int i;
6 float r = 0.0;
7 for(i = 0; i <= len - 1; ++i)
8 {
9 r += a[i];
10 }
11
12 return r;
13 }
14
15 int main()
16 {
17 printf("-1 < 0U : %s\n", (-1 < 0U) ? "true" : "false");
18 printf("2147483647U > -2147483647 - 1 : %s\n", ( 2147483647U > -2147483647 - 1) ? "true" : "false");
19 printf("2147483647 > (int)2147483648U : %s\n", ( 2147483647 > (int)2147483648U) ? "true" : "false");
20
21 unsigned w = 0xFFFF;
22 printf("(int) ((w << 24) >> 24) = %x\n", (int) ((w << 24) >> 24));
23 printf("((int)(w << 24)) >> 24 = %x\n", ((int)(w << 24)) >> 24);
24
25 float a[1];
26 printf("sum %f\n", sum(a, 0));
27 return 0;
28 }
運(yùn)行結(jié)果:
1 hcy@hcy-desktop:~$ ./a.out
2 -1 < 0U : false
3 2147483647U > -2147483647 - 1 : false
4 2147483647 > (int)2147483648U : true
5 (int) ((w << 24) >> 24) = ff
6 ((int)(w << 24)) >> 24 = ffffffff
7 段錯(cuò)誤
相關(guān)推薦:2010年全國(guó)計(jì)算機(jī)等級(jí)考試考試報(bào)考指南北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |