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 |
- 結果為-15,不正确
- 以補碼方式相加:
十進制數 | 補碼 |
---|---|
9 | 0000 1001 |
-6 | 1111 1010 |
- 最高位的1溢出,剩餘8位二進制表示的是3,正确。
-
在計算機系統中,數值一律采用補碼來存儲,主要原因是:
①、統一了零的編碼。
②、将符号位和其他位統一處理。
③、将減法運算轉變為加法運算。
④、兩個用補碼表示的數相加時,如果最高位(符号位)有進位,則進位被舍棄。
5.sizeof關鍵字
-
不是函數,是以不需要包含任何頭檔案,它的功能是計算一個資料類型的大小,機關是位元組。sizeof
-
的傳回值為size_tsizeof
-
類型在32位作業系統下是size_t
,是一個無符号的整數。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代表負數。
- 使用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)無符号位
- 無符号位最高位不是符号位,而就是數的一部分,無符号數不可能是負數。
- 使用unsigned關鍵字定義無符号變量
#include<stdio.h>
int main()
{
unsigned int a = -3236958022;//定義無符号整型變量a
printf("%X\n",a);//C0F00F46
return 0;
}
- 當我們寫程式要處理一個不可能出現負值的時候,一般用無符号數,這樣可以增大數的表達最大值。
(3)有符号和無符号整型取值範圍
7.字元型:char
- 字元型變量用于存儲一個單一字元,在C語言中使用
表示,其中char
。在給字元型變量指派時,需要用一對英文半角格式的每一個字元變量都會占用1個位元組
把字元括起來。單引号('')
- 字元變量實際上并不是把該字元本身放到變量的記憶體單元中去,而是将該字元對應的ASCII編碼放到變量的存儲單元中。char的本質就是一個1個位元組大小的整型