tft每日頭條

 > 生活

 > c語言補碼轉原碼

c語言補碼轉原碼

生活 更新时间:2024-10-21 07:02:23

最近小編在寫C 編碼轉換的問題,都快被弄瘋來,看來很多資料感覺自己在計算機變成底層這一塊不是很熟練,所以惡補來一下,這邊總結出來給大家分享。

大家都知道計算機隻認識0和1,但是0和1對人又不友好,怎麼做到這兩者的轉換呢?這就需要從計算機的存儲講起。

c語言補碼轉原碼(C手撕底層位)1

位和字節

位:來自英文bit,音譯為“比特”,表示二進制位。位是計算機内部數據儲存的最小單位,11010100是一個8位二進制數。

字節:來自英文Byte,音譯為“拜特”,習慣上用大寫的“B”表示。字節是計算機中數據處理的基本單位。計算機中以字節為單位存儲和解釋信息,規定一個字節由八個二進制位構成,即1個字節等于8個比特(1Byte=8bit)。八位二進制數最小為00000000,最大為11111111;通常1個字節可以存入一個ASCII碼,2個字節可以存放一個漢字國标碼。

unsigned int、signed int和unsinged char 、signed char

一般來說char類型變量在計算機内存裡占用1個字節,也就是8個比特(byte),unsinged就是無符号的意思,signed就是有符号的意思。char默認是unsinged類型

c語言補碼轉原碼(C手撕底層位)2

char

如果是unsinged char那麼最高位(最左邊)就可以用來表示數字,那麼char能表示的範圍是二進制的00000000~11111111,轉換為十進制就是0~255。

如果是signed char那麼最高位(最左邊)就需要用來表示正負0為正,1為負,那麼隻有剩餘7位能表示數字,所以能表示的範圍就是1111 1111~01111111 ,轉換位十進制就是 - 127~ 127。還有一個 1000 0000 用它來表示 -128,因為沒有負0的概念。計算機裡負數都是用補碼來表示。關于補碼的概念後面會講。

unsigned int和signed int在char的基礎上理解,隻不過int是四個字節,也就是4*8=32位。int默認是signed有符号位的。所以,unsigned int表示的範圍是:0~2的32次方-1。signed int表示的範圍是:-2的31次方~2的31次方-1。

c語言補碼轉原碼(C手撕底層位)3

int

原碼、反碼、補碼

要了解清楚原碼、反碼、補碼需要先了解兩個額外的概念:機器數和真值

機器數:一個數在計算機中的二進制表示形式, 叫做這個數的機器數。機器數是帶符号的比如,十進制中的數 3 ,計算機字長為8位,轉換成二進制就是00000011。如果是 -3 ,就是 10000011 。這裡的 00000011 和 10000011 就是機器數。

真值:拿上面的機器數00000011(十進制 3)來講,其形式值131(又二進制轉10進制得來),但是實際我們要的是 3,所以我們需要去掉最高位符号位:0000 0001的真值 = 000 0011 = 3,1000 0001的真值 = –000 0011 = –3。

好,了解來上面兩個概念,我們就可以來看原碼、反碼、補碼了

原碼:顧名思義,原碼就是我原來要表示的值的二進制碼,所以 3/-3的原碼是需要考慮符号位的: 3的原碼是:0000 0011。-3的原碼是:1000 0011。

反碼:

正數的反碼是其本身

負數的反碼是在其原碼的基礎上, 符号位不變,其餘各個位取反

3 原碼是:0000 0011 反碼是:0000 0011

-3 原碼是:1000 0011 反碼是:1111 1100

補碼:

正數的補碼就是其本身

即在反碼的基礎上 1

3 原碼是:0000 0011 反碼是:0000 0011 補碼是:0000 0011

-3 原碼是:1000 0011 反碼是:1111 1100 補碼是:1111 1101

為什麼要存在這麼多碼

看完上面的内容,大家一定很懵,為什麼要弄這麼多碼。這是因為計算機是不辨别"符号位",因為這顯然會讓計算機的基礎電路設計變得十分複雜! 于是人們想出了将符号位也參與運算的方法。我們知道, 根據運算法則減去一個正數等于加上一個負數, 即: 1-1 = 1 (-1) = 0 , 所以機器可以隻有加法而沒有減法, 這樣計算機運算的設計就更簡單了。

在加減乘除中,正數當然很好處理,如果遇到負數就會有問題,我們來看一下3-3如果用原碼運算會怎麼樣:

3-3在計算機中隻有加法,所以3-3=3 (-3);

0000 0011 1000 0011=10000110,我們算上符号轉為十進制是:-6;

既然原碼不行,那用反碼?好,試一下看看

0000 0011 1111 1100 = 111111111,我們算上符号轉為十進制是:-127;

那再試試補碼

0000 0011 1111 1101 = 00000000;我們算上符号轉為十進制是:0;

OK,是對的;

所以計算機存數值都是存補碼。至于補碼背後的數學原理,這裡超出了編程範圍,主要是小編也不太懂啊!大家有興趣的可以去查一查。好像是什麼同餘原理。

END

純手KEY,希望大家多多支持小編,點個關注~~~

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved