首先,正數的補碼與原碼相同。計算機內數值的儲存和計算方式是補碼。
當我們打出a=255
時,如果a是個整數變數,則有四個位元組,即32位,所以255原碼和補碼是00000000 00000000 00000000 11111111(不同於a為字元變數)。賦值給a後,a的原碼和補碼同為00000000 00000000 00000000 11111111 。當計算機讀取a時,a仍是255。
但是當a為字元變數時,a只有乙個位元組,即8位。此時255的原碼和補碼為(0)11111111。強行賦值後a的原碼和補碼為11111111(溢位了乙個0),此時計算機讀取出來的數字為-127。這是因為最高位不再是255括號中的0,是a中的1。
當a=-255
時,同理,a為整數時,-255的原碼為10000000 00000000 00000000 11111111,補碼為11111111 11111111 11111111 00000001。賦值給整數a後,a的補碼為11111111 11111111 11111111 00000001。計算機讀取時,讀出仍為-255。
但是當a為字元變數時,-255的原碼為10000000 11111111,補碼為11111111 00000001。賦值給a後,a為00000001,計算機讀取出來為1。
總結:需儲存的十進位制數字絕對值先轉化成純二進位制數值(先忽略符號)。例如255為11111111,-255也為11111111。
算入符號,變成原碼(機器碼)。根據變數型別,整數最高位為0,負數最高位為1。例如整數型的255為00000000 00000000 00000000 11111111,字元型的255為(0)11111111。整數型的-255為10000000 00000000 00000000 11111111,字元型的-255為(1)11111111。
根據規則,將原碼轉成補碼。
將補碼從後往前,每位依次對應給變數的每位,溢位的直接捨棄。
當計算機讀取時,將變數的最高位看作符號位,其餘的是數值位,這才有了255賦給字元a,導致輸出為-127 。
計算機讀取補碼時,數值位最後一位減一,再反轉,即原碼轉補碼的反操作。最終得到原碼,再轉化成十進位制數字。
C語言 整數
1 整數型別 long int long short int short ubsigned int unsigned unsigned long unsigned short long long short型別可能比int型別占用的空間少,long型別可能比int型別占用的空間多。c語言只是規定sh...
C語言指標賦值
1 指標的初始化 指標初始化時,的右運算元必須為記憶體中資料的位址,不可以是變數,也不可以直接用整型位址值 但是int p 0 除外,該語句表示指標為空 此時,p只是表示定義的是個指標變數,並沒有間接取值的意思。例如 int a 25 int ptr a int b 10 int point b i...
c語言陣列賦值
最近在學c語言,把給陣列賦值的方式總結一下 1 利用malloc include include void main int a a int malloc 2 sizeof int int i 0 int j 1 a 0 i a 1 j int times for times 0 times 2 直...