程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> 關於C >> C語言之注意基本類型的范圍

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

編輯:關於C

[cpp]
#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 ’,則認為本字符串結束。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved