日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Unsigned 陷阱

發布時間:2025/3/11 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 陷阱的全部內容,希望文章能夠幫你解決所遇到的問題。

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