帶你快速瞭解原碼、反碼、補碼,搞定進制轉換

前言

很多的小夥伴在學習計算機相關課程的時候,經常會聽到原碼、反碼、補碼等詞語,但是很少有人能夠理解它們具體是幹嘛的。但是隨着編程的深入,我們知道在計算機中只能存儲0和1的二進制碼,所有數據類型最後都會轉爲二進制碼再存儲到內存中。所以理解這些知識能夠幫助你理解數值在內存當中的存儲方式。

並且進制轉換也是一個重點,不管是在大學的期末考試還是找工作的面試題,這都是需要了解的知識。今天冷月就帶大家來梳理一下原碼、反碼、補碼的相關知識,並講解一下進制轉換的方法。

原碼

原碼也叫符號-絕對值碼;最高位0則表示正數,最高位1則表示負數,其餘的二進制位是該數字的絕對值的二進制位。也就是說原碼的最高位代表他是正數或者是負數,而其餘的位數才代表具體的值。

舉個例子:
假如:我們用8位二進制表示一個數,+11的原碼爲00001011,-11的原碼就是10001011

原碼簡單易懂,但是它的加減運算複雜,而且零的表示不唯一,所以在計算機中並不是直接用數值的原碼來存儲。

反碼

反碼通常是用來由原碼求補碼或者由補碼求原碼的過渡碼。直接將二進制位按位取反。而反碼的運算不遍,也沒有在計算機中應用。

假如:我們用8位二進制表示一個數,+11的反碼爲11110100,-11的原碼就是01110100

補碼

在計算機系統中,數值一律用補碼來表示和存儲。原因在於,使用補碼,可以將符號位和數值域統一處理;同時,加法和減法也可以統一處理。

如下圖所示:

8421法

一種2進制轉16進制的簡便方法。簡單來說16進制也就是表示16種狀態,而二進制數要表示16種狀態,則需要4位才能夠表示。所以我們用4位二進制數來表示1位16進制數,不夠的位數前面補0。

而對應的4位二進制數分別等於10進制的8 4 2 1。

如下圖所示:

進制轉換(求補碼)

已知十進制求二進制:

求正整數的二進制(補碼):除2取餘,直至商爲0,餘數倒序排列。

求負整數的二進制(補碼):先求與該負數相對應的正整數的二進制補碼,然後將所有位取反,末尾加1,不夠位數時,左邊補1。

求零的二進制(補碼):全是0。

#include<stdio.h>

/*
公衆號:學長冷月
*/
int main()
{
	printf("%#X\n",18); //輸出0X12
	printf("%#X\n",-18); //輸出0XFFFFFFEE
	return 0;
}

我們來分析一下上面的運行情況。我們知道正數的原碼、反碼、補碼相同,在C語言中int類型在內存中分配4個字節,也就是32位。而C語言中不能直接輸出二進制,所以我們輸出16進制。如下圖所示:

已知二進制補碼求十進制:

如果首位是0,則表明是正整數,按普通方法來求;
如果首位是1,則表明是負整數,將所有位取反,末尾加1,所得數字就是該負數的絕對值;
如果全是0,則對應的十進制數字就是0

#include<stdio.h>

/*
公衆號:學長冷月
*/
int main()
{
	printf("%d\n",0X12); //輸出18
	printf("%d\n",0XFFFFFFEE); //輸出-18
	return 0;
}

上面的運行情況就是已知十進制求二進制的逆過程。計算過程如下圖:

如果這篇博文有幫助到您,可以幫冷月點一個贊或者加一個關注哦!

歡迎關注我的公衆號:學長冷月,獲得獨家整理的學習資源和日常乾貨推送。
如果您對我的專題內容感興趣,也可以關注我的博客:www.guoyu7.com

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章