日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Unsigned 陷阱

發布時間:2025/3/11 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Unsigned 陷阱 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

unsigned是整形的一種類型,表示無符號,一般用于unsigned int和unsigned char,如果沒有理解unsigned的意義將會在做題中掉入陷阱,下面通過介紹幾個例子來說明:
1、

int main() {unsigned int i;for (i = 10;i >= 0; i--){printf("你好\n");}return 0; }

這個程序,打眼一看結果就是輸出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、

int main() {unsigned char a[500];int i;for (i = 0;i < 500; i++){a[i] = -1 - i;}printf("%d",strlen(a));system("pause");return 0; }

和上面一道題一樣,打眼一看結果就是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 陷阱的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。