歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

C語言之注意基本類型的范圍

#include <stdio.h>
#include <string.h>

int main()
{
    char arr[1000];
    int i;
    for (i=0; i<1000; i++)
    {
        arr[i] = -1-i;
    }
    printf("%d\n",strlen(arr));

    return 0;
}

大家一眼看到這個,會說出什麼答案呢?肯定有不同的答案的。正確的答案應該是255。

255?或許有些人不解為什麼會是255,就是因為數組的類型char,在這裡面表示有符號的char。

for 循環內,當i 的值為0 時,a[0] 的值為-1 。關鍵就是-1 在內存裡面如何存儲。我們知道在計算機系統中,數值一律用補碼來表示(存儲)。主要原因是使用補碼,可以將符號位和其它位統一處理;同時,減法也可按加法來處理。另外,兩個用補碼表示的數相加時,如果最高位(符號位)有進位,則進位被捨棄。正數的補碼與其原碼一致;負數的補碼:符號位為1 ,其余位為該數絕對值的原碼按位取反,然後整個數加1。

按照負數補碼的規則,可以知道-1 的補碼為0xff ,-2 的補碼為0xfe…… 當i 的值為127時,a[127] 的值為-128 ,而-128 是char 類型數據能表示的最小的負數。當 i 繼續增加,a[128]的值肯定不能是-129 。因為這時候發生了溢出,-129 需要9 位才能存儲下來,而char 類型數據只有8 位,所以最高位被丟棄。剩下的8 位是原來9 位補碼的低8 位的值,即0x7f 。當i 繼續增加到255 的時候,-256 的補碼的低8 位為0 。然後當i 增加到256 時,-257 的補碼的低8 位全為1 ,即低八位的補碼為0xff ,如此又開始一輪新的循環……

按照上面的分析,a[0] 到a[254] 裡面的值都不為0 ,而a[255] 的值為0 。strlen 函數是計算字符串長度的,並不包含字符串最後的‘\0 ’。而判斷一個字符串是否結束的標志就是看是否遇到‘\0 ’。如果遇到‘\0 ’,則認為本字符串結束。

 

 

 

Copyright © Linux教程網 All Rights Reserved