天天看點

原碼、反碼、補碼相關運算操作和sizeof關鍵字

1.原碼

  • 一個數的原碼(原始的二進制)有如下特點:

    ①、最高位做為符号位,0表示正,1表示負。

    ②、其他數值部分就是數值本身絕對值的二進制數。

    ③、負數的原碼是在其絕對值的基礎上,最高位為1。

  • 下面數值以1位元組的大小描述:
十進制數 原碼
+15 0000 1111
-15 1000 1111
+0 0000 0000
-0 1000 0000
  • 原碼表示方法簡單易懂,與帶符号數本身轉換友善,隻要符号還原即可,但當兩個正數相減或不同符号數相加時,必須比較兩個數那個絕對值大,才能決定誰減誰,才能确定結果是正還是負,是以原碼不便于加減運算。

2.反碼

  • 對于正數,反碼與原碼相同。
  • 對于負數,符号位不變,其他部分取反(1變0,0變1)
十進制數 反碼
+15 0000 1111
-15 1111 0000
+0 0000 0000
-0 1111 1111

3.補碼

  • 在計算機相同中,數值一律用補碼來存儲
  • 補碼特點:

    ①、對于正數,原碼、反碼、補碼相同。

    ②、對于負數,其補碼為它的反碼加1.

    ③、補碼符号位不動,其他位求反,最後整個數加1,得到反碼。

十進制數 補碼
+15 0000 11111
-15 1111 0001
+0 0000 0000
-0 0000 0000

4.補碼的意義

(1)示例一:用8位二進制分别表示+0和-0

十進制數 原碼
+0 0000 0000
-0 1000 0000
十進制數 反碼
+0 0000 0000
-0 1111 1111
  • 不管以原碼方式存儲,還是以反碼方式存儲,0也有兩種表示形式。為什麼同樣一個0有兩種不同的表示方法呢?
  • 但是如果以補碼方式存儲,補碼統一了零的編碼:
十進制數 補碼
+0 0000 0000
-0 10000 0000 由于隻用8位描述,最高位1丢棄,變為0000 0000

(2)示例二:計算9-6的結果

  • 以原碼方式相加:
十進制數 原碼
9 0000 1001
-6 1000 0110
原碼、反碼、補碼相關運算操作和sizeof關鍵字
  • 結果為-15,不正确
  • 以補碼方式相加:
十進制數 補碼
9 0000 1001
-6 1111 1010
原碼、反碼、補碼相關運算操作和sizeof關鍵字
  • 最高位的1溢出,剩餘8位二進制表示的是3,正确。
  • 在計算機系統中,數值一律采用補碼來存儲,主要原因是:

    ①、統一了零的編碼。

    ②、将符号位和其他位統一處理。

    ③、将減法運算轉變為加法運算。

    ④、兩個用補碼表示的數相加時,如果最高位(符号位)有進位,則進位被舍棄。

5.sizeof關鍵字

  • sizeof

    不是函數,是以不需要包含任何頭檔案,它的功能是計算一個資料類型的大小,機關是位元組。
  • sizeof

    的傳回值為size_t
  • size_t

    類型在32位作業系統下是

    unsigned int

    ,是一個無符号的整數。
#include <stdio.h>

int main()
{
	int a;
	int b = sizeof(a);//sizeof得到指定值占用記憶體的大小,機關:位元組
	printf("b = %d\n", b);//b=4

	size_t c = sizeof(a);
	printf("c = %u\n", c);//用無符号數的方式輸出c的值 c=4

	return 0;
}
           

6.有符号數和無符号數差別

(1)有符号數

  • 有符号數是最高位為符号位,0代表整數,1代表負數。
    原碼、反碼、補碼相關運算操作和sizeof關鍵字
  • 使用signed關鍵字定義有符号變量
#include<stdio.h>
int main()
{
	signed int a = -1089474374;//定義有符号整型變量a
	printf("%X\n",a);//BF0FF0BA

	//B       F      0        F       F     0        B	      A
	//1011 1111 0000 1111 1111 0000 1011 1010
	
	return 0; 
}
           

(2)無符号位

  • 無符号位最高位不是符号位,而就是數的一部分,無符号數不可能是負數。
    原碼、反碼、補碼相關運算操作和sizeof關鍵字
  • 使用unsigned關鍵字定義無符号變量
#include<stdio.h>
int main()
{
	unsigned int a = -3236958022;//定義無符号整型變量a
	printf("%X\n",a);//C0F00F46
	
	return 0;
} 
           
  • 當我們寫程式要處理一個不可能出現負值的時候,一般用無符号數,這樣可以增大數的表達最大值。

(3)有符号和無符号整型取值範圍

原碼、反碼、補碼相關運算操作和sizeof關鍵字

7.字元型:char

  • 字元型變量用于存儲一個單一字元,在C語言中使用

    char

    表示,其中

    每一個字元變量都會占用1個位元組

    。在給字元型變量指派時,需要用一對英文半角格式的

    單引号('')

    把字元括起來。
  • 字元變量實際上并不是把該字元本身放到變量的記憶體單元中去,而是将該字元對應的ASCII編碼放到變量的存儲單元中。char的本質就是一個1個位元組大小的整型

繼續閱讀