關於char的溢位問題

2021-08-08 10:00:10 字數 926 閱讀 7728

現在看下面的問題

int main()

結果為什麼是-127?

int main()

結果為什麼是127?

解析:首先要知道三點

第一點:大家知道char型別的取值範圍是-128到127,這是char型別的儲存空間限制的。char型別的變數佔1個位元組,最高位為符號位,0代表正數,1代表負數。這樣char型別最大為(0111 1111)即127.儲存範圍不再它的取值範圍的話會造成溢位。

第二點:數值資料在記憶體中是以資料的補碼形式存放的,比如存放乙個正整數127,由於正數的補碼就是原始碼,所以存放在記憶體中即為0111 1111.而如果要存放乙個負數-2,系統會首先得到該負數的補碼(取絕對值後取反,再加1)即1111 1110,再儲存儲存起來。讀取的時候執行相反操作。

第三點:char型別的變數在使用時系統會將其擴充套件為int型別,高24位補符號位。變數的正負通過擴充套件的24位決定,1代表負數,0代表整數。

結果:char number = 129時,賦值給number後,number代表的儲存空間中儲存的是1000 0001,但取出來的時候,因符號位是1,系統認為他是乙個負數的補碼,1000 0001其實就是-127的補碼,故第乙個輸出的是-127;

char number = -129時,number代表的儲存空間是0111 1111,因為,-129的原碼是1 1000 0001,反碼是1 0111 1110 ,補碼是1 0111 1111.系統讀低8位,也就是0111 1111,認為是乙個正數,而0111 1111是127的補碼,故輸出127.

總述:可以這麼理解:跟時鐘的原理一樣,繞圈圈,129時溢位了,比127多了2,則繞回2個,到了-127;num等於-129時,比-128少1,則繞回了127.

關於修復緩衝區溢位問題

為什麼會出現緩衝區溢位 出現緩衝區溢位需要具備很多條件,包括 現在我們來仔細看看以上每種條件。首先,緩衝區溢位主要出現在 c 和 c 中,因為這些語言不執行陣列邊界檢查和型別安全檢查。c c 允許開發人員建立非常接近硬體執行的程式,從而允許直接訪問記憶體和計算機暫存器。其結果可以獲得優異的效能 很難...

關於操作有符號數的溢位問題

在計算機中,數值的二進位制表示方法主要有 原碼 反碼和補碼。通常取最高位為符號位,0表示正數,1表示負數。正數的原碼 反碼 補碼一樣。而負數的原碼最高位取1,數值位取負數絕對值的二進位制值 反碼的符號位為1,其餘位取反 補碼的符號位為1,其餘位取反加1。在32位計算機中,有符號字元型變數的取值範圍是...

ARM 堆疊溢位問題

今天一大早就有個師弟在qq上問了我乙個問題,先把 貼出來.softwareinterrupt stmfd sp mov r1,sp mrs r3,spsr tst r3,t bit thumb mode ldrneh r0,lr,2 yes,fetch swi no.in thumb mode bi...