unsigned/signed int/char類型表示的數值范圍


 

一個32位的signed int類型整數表示的范圍:-2^31~2^31-1

一個32位的unsigned int類型整數表示的范圍: 0~2^32-1

 

一個8位的signed char類型整數表示的范圍:-2^7~2^7-1

一個8位的unsigned char類型整數表示的范圍: 0~2^8-1

 

示例:

1
2
3
4
5
6
7
8
9
10
11
int  main()
{
     char  a[1000];
     int  i = 0;
     for (i=0; i<1000; i++)
     {
          a[i] = -1 - i;
     }
     printf ( "%d\n" strlen (a));
     return  0;
}

 

答案:255

分析:

當i的值為0時,a[0]的值為-1,關鍵就是-1在內存是如何存儲的。

我們知道,在計算機內部數值一律使用補碼存儲。正數的補碼與原碼一致,負數的補碼是符號位為1,其余位是該負數的絕對值按位取反后加1得到。

按照負數的補碼規則,可以知道-1的補碼是0xff,-2的補碼是0xfe。。。當i的值為127的時候,a[127]的值為-128,是char能表示的最小的數值。當i=129時,a[128]=-129,這時候發生溢出,-129需要9位才能保存下來,但是char的類型數據只有8位,所以最高位被丟棄,剩下的8位是原來9位補碼的低8位,為1000 0000,當i增加到255時候,a[255]=-256,-256的補碼的低8位是0000 0000,然后i=256時,a[256]=-257的補碼低8位為1111 1111,由此開始新一輪的循環。。。。

按照上面的分析,a[0]---a[254]的值都不為0,而a[255]的值為0,strlen函數是計算字符串長度的,並不包含字符串最后的'\0'。所以strlen(a)=255.

 

 

那么,+0和-0在內存是如何存儲的呢?

十進制          原碼            反碼          補碼

 +0         0000 0000    0000 0000   0000 0000

 -0        10000 0000    1111 1111   0000 0000


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM