c语言ffffff错误,C语言打印16进制出现0xffffff现象的问题剖析!
C語(yǔ)言打印16進(jìn)制出現(xiàn)0xffffff現(xiàn)象的問題剖析!
其實(shí)類似的問題不是只在網(wǎng)絡(luò)程序中才會(huì)出現(xiàn)的,看示例代碼:
復(fù)制代碼
1 #include
2 int main()
3 {
4 ? ? char c = 0xc9;
5 ? ? printf("A:c = %2x\n",(unsigned char)c);
6 ? ? printf("B:c = %2x\n",c & 0xff);
7 ? ? printf("C:c = %2x\n",c);
8 ? ? return 0;
9 }
復(fù)制代碼
程序輸出如下:
A:c = c9
B:c = c9
C:c = ffffffc9
可以看到:
把c轉(zhuǎn)換成unsigned char打印是正確的。視作情況A。
把c與 0xff做&操作后打印正確。視作情況B。
對(duì)c不做任何處理,則問題復(fù)現(xiàn)了,打印出ffffffc9。視作情況C。
情況A B是我百度來(lái)的一些解決C現(xiàn)象的方法。那么我們現(xiàn)在來(lái)逐一分析解釋ABC三種情況。
首先我們必須知道,printf()函數(shù)的%x(X)輸出的是Int型別的16進(jìn)制格式。所以char型別的c變量會(huì)被轉(zhuǎn)換成Int型別。
其次,我們的知道計(jì)算機(jī)是用補(bǔ)碼表示數(shù)據(jù)的。關(guān)于原碼,反碼,補(bǔ)碼的知識(shí)請(qǐng)自行充電。
情況C:
c的補(bǔ)碼:11001001(0xc9)。
c的反碼:11001000(0xc9)。
c的原碼:10110111(0xc9)。
因?yàn)閏har型別是帶符號(hào)的,所以最高位的1這里視為負(fù)號(hào)。
把c轉(zhuǎn)換成Int型別 ? char ?-----> Int
Int_c的原碼:10000000 00000000 00000000 00110111(把c原碼的最高位1 ?提到最高位。其余高位補(bǔ)0)。
Int_c的反碼:11111111 11111111 11111111 11001000
Int_c的補(bǔ)碼:11111111 11111111 11111111 11001001(0xffffffc9)。
所以打印出來(lái)看似詭異的值其實(shí)是合情合理的。如何避免?看AB情況。
情況B:
我們?cè)谇闆rC的基礎(chǔ)上將c與0xff做&操作。
Int_c的補(bǔ)碼:11111111 11111111 11111111 11001001(0xffffffc9)。
&
00000000 00000000 00000000 11111111
最終結(jié)果為: 00000000 00000000 00000000 11001001(0xc9)。
情況A:
我覺得情況A的處理方式才是最正規(guī)的處理辦法,但是據(jù)說(shuō)linux內(nèi)核使用(&0xff)。
c的補(bǔ)碼:11001001(0xc9)。
c的反碼:11001001(0xc9)。
c的原碼:11001001(0xc9)。
這里強(qiáng)制轉(zhuǎn)換c為unsigned char型別。因此最高位的1不是正負(fù)號(hào)
把c轉(zhuǎn)換成Int型別 ? char ?-----> Int
Int_c的原碼:00000000 00000000 00000000 11001001(把c原碼的最高位1 ?提到最高位。其余高位補(bǔ)0)。
Int_c的反碼:00000000 00000000 00000000 11001001
Int_c的補(bǔ)碼:00000000 00000000 00000000 11001001(0xc9)。
因此打印正常。
以上分析,如有不正確的地方請(qǐng)各位指正。
http://www.dengb.com/Cyy/1052695.htmlwww.dengb.comtruehttp://www.dengb.com/Cyy/1052695.htmlTechArticleC語(yǔ)言打印16進(jìn)制出現(xiàn)0xffffff現(xiàn)象的問題剖析! 其實(shí)類似的問題不是只在網(wǎng)絡(luò)程序中才會(huì)出現(xiàn)的,看示例代碼: 復(fù)制代碼 1 #include stdio.h 2 i...
總結(jié)
以上是生活随笔為你收集整理的c语言ffffff错误,C语言打印16进制出现0xffffff现象的问题剖析!的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言输入end时结束程序,给大家一个程
- 下一篇: 清华大学c语言指针ppt,清华大学出版社