一個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