char 型別 127 1 128問題

2021-10-17 03:53:33 字數 1285 閱讀 3042

最近準備面試,發現應屆生考的比較多的就是基礎,我面向c/c++,則做到的筆試題也有很多相關的題,其中就有charl型別變數a = 127 ,a+1 = ?的問題,這裡記錄一下自己的理解

我們知道char型別儲存的值的範圍是-128~127,127為正數的最大,再進行加一就會產生溢位操作:

計算機內部計算都是使用的二進位制的補碼進行計算:

127的二進位制補碼: 01111111

127+

1後的二進位制補碼:10000000

可以看出127

+1 後的二進位製碼正好是規定的-

128的二進位制補碼,所以列印結果就是-

128

同理,可以進行127 + 2的過程解釋:

127的二進位制補碼:01111111

2的二進位制補碼:000000010

127+

2: 01111111

+00000010

=10000001

可以看到補碼10000001為-

127的補碼,所以127+2

=-127

從位擴充套件的角度解釋:當127溢位時,就進行位數擴充套件,比如擴充套件成16位:

127的二進位制原碼:01111111

2的原碼:00000010

127+

2 會溢位 ,所以擴充套件位數:

127擴充套件後補碼 : 00000000

01111111

2擴充套件後補碼 : 00000000

00000010

127+

2: 00000000

01111111

00000000

00000010

=00000000

10000001

擷取低八位: 100000001 為 -

127補碼

上面的解釋是基於:

char a =

127;

a++;

printf

("%d\n"

,a):

還有一種考法:

char a =

127;

printf

("%d\n"

,a+1

);

這個對應的結果就是128,因為a+1表示式會先進行型別轉換,char型別的a會轉換為高階別的int型別,所以a = int(127),int型別為32位,+1後不會溢位,列印為128

ARM下char型別符號問題

最近在專案中遇到問題,在x86平台下除錯好的程式,移植到arm上,程式行為完全變了。示例如下 include include int main int argc,char argv else return 0 在x86平台輸出smaller than 128。在arm平台輸出bigger than ...

char 與char 型別的區別

參考文章 char s 和 char s 的區別小結 char s1 hello char s2 hello 區別所在 char s1 的s1是指標變數,而指標是指向一塊記憶體區域,它指向的記憶體區域的大小可以隨時改變,但當指標指向常量字串時,它的內容是不可以被修改的,否則在執行時會報錯。char ...

CHAR型別和VARCHAR型別

char和varchar類似,僅僅是儲存和檢索方式不同。char型別和varchar型別宣告的長度表示你想要儲存的最大字元數。但是char型別的長度是不可變的,varchar型別的長度是可變的 定義乙個char 10 和varchar 10 如果存進去的是 abcd 那麼char所佔的長度依然為10...