[csharp]
view plain
copy
#include "stdio.h"
#include "string.h"
intmain()
printf("%d"
,strlen(a));
return
0;
}
此題看上去真的很簡單,但是卻鮮有人答對。答案是255。別驚訝,我們先分析分析。
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』,則認為本字串結束。
分析到這裡,strlen(a)的值為255 應該完全能理解了。這個問題的關鍵就是要明白char型別預設情況下是有符號的,其表示的值的範圍為[-128,127],超出這個範圍的值會產生溢位。另外還要清楚的就是負數的補碼怎麼表示。弄明白了這兩點,這個問題其實就很簡單了
1087 有多少不同的值(C語言)
當自然數 n 依次取 1 2 3 n 時,算式 n 2 n 3 n 5 有多少個不同的值?注 x 為取整函式,表示不超過 x 的最大自然數,即 x 的整數部分。輸入給出乙個正整數 n 2 n 10 4 在一行中輸出題面中算式取到的不同值的個數。201714801.自然數 n 依次取 1 2 3 n ...
c語言返回值為陣列的問題
借鑑他人,自我學習 1.可以用陣列輸出 返回值為指標形式,傳參為指標。返回乙個位址 例如 char text char tmp return tmp int main printf s text ffffx 輸出的結果為ffffx 但是如果這樣寫 char text char tmp 30 ffff...
C語言函式返回值為指標和函式返回值為void
有時遇到函式返回值為空和函式返回值為指標的情況下,需要在前面定義該函式 函式的返回值為指標也必須在此定義,函式的返回值為void必須在此定義,返回值是整形或者其他基本型別不需要在此定義 函式功能 把格式化的資料寫入某個字串 函式原型 int sprintf char buffer,const cha...