mysql 字串後8位 字元的一位元組8位問題

2021-10-17 22:43:02 字數 1081 閱讀 1077

#include

int main()

char a[1000];

int i;

for(i=0;i<1000;i++)

a[i]=-1-i;

printf("%d\n",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],超出這個範圍的值會產生溢

出。另外還要清楚的就是負數的補碼怎麼表示。弄明白了這兩點,這個問題其實就很簡單了

8 字串函式

right left 可從列中選出指定數量的字元 right location,2 location 欄位 substring index 可擷取部分字段值 substring index location,1 尋找第乙個逗號,然後擷取之前的內容 substring your string,star...

練習8 字串排序

目的 輸入任意長度字串,使其按a z 或者說是按ascii碼順序排列 這裡使用字元陣列儲存,使用選擇排序的方法進行排序,關於選擇排序,可參考我之前的部落格練習7,有詳細說明 這裡根據字元對應的ascii碼的十進位制數進行排序,關於ascii碼不做過多解釋.include includevoid sw...

8 字串轉整數

請你來實現乙個 atoi 函式,使其能將字串轉換成整數。首先,該函式會根據需要丟棄無用的開頭空格字元,直到尋找到第乙個非空格的字元為止。接下來的轉化規則如下 如果第乙個非空字元為正或者負號時,則將該符號與之後面盡可能多的連續數字字元組合起來,形成乙個有符號整數。假如第乙個非空字元是數字,則直接將其與...