Unsigned 陷阱
unsigned是整形的一種類型,表示無符號,一般用于unsigned int和unsigned char,如果沒有理解unsigned的意義將會在做題中掉入陷阱,下面通過介紹幾個例子來說明:
1、
這個程序,打眼一看結果就是輸出11個“你好”,然而并不是這樣,輸出的一個死循環,為什么呢?
當i=0時,輸出第11次“你好”,再次執行i–時,i本應該等于-1,此時已經不符合i>=0的條件,應該退出循環,但應該注意i是無符號整形,當i=-1時,此時的i是有符號的,此時就要用到數據在計算機中的存儲方式是二進制。
-1:
原碼:1000 0000 0000 0000 0000 0000 0000 0001
反碼:1111 1111 1111 1111 1111 1111 1111 1110
補碼:1111 1111 1111 1111 1111 1111 1111 1111
由于-1是負數,故原碼最高位為1,取反碼時,最高位不參與,最終的補碼就是-1在計算機中存儲的二進制,此時i就默認等于4294967295,因為其原碼和-1的補碼相同,也就是說i永遠滿足i>=0條件。
2、
和上面一道題一樣,打眼一看結果就是500,毫無疑問,然而結果總是出人意料,結果是255,這又是為什么呢?
unsigned char的取值范圍是0-255,當i=0時,a[0]=255,a[1]=254,當i=255時,-1-i=-256,此時已超過了unsigned char的范圍。
-256:
原碼:1 0000 0000
反碼:0 1111 1111
補碼:1 0000 0000
因為unsigned char 是一個字節,8個bit,所以就失去了最高位1,此時a[255]=0,注意后面的strlen(a)函數,這是一個計算數組元素個數的函數,逢“0”就停止計算,就是說計算到a[255]的時候就停止了,計算了從a[0]-a[254]共255個數,最終結果就是255。
總結
以上是生活随笔為你收集整理的Unsigned 陷阱的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MFC中CString类字符串用法小结
- 下一篇: csapp bufbomb实验