1.整型的歸類
char
short
int
long
以上都分為有符號(signed)與無符號(unsigned)的類型
2.原碼、反碼和補碼
2.1 定義
計算機在表示一個數(shù)字時,是采用二進制的方式,所以為了準確表示一個數(shù)的正負,每一個有符號數(shù)都將其最高位視作是符號位,最高位為0表示正數(shù),最高位為1表示負數(shù)。我們接下來以有符號整型int的數(shù)字進行分析。
一個有符號整數(shù)由 符號位 + 數(shù)值位 組成,數(shù)值位是其最高位,分別以0/1表示正/負
對于正數(shù)來說,反碼補碼都與原碼相同;
對于負數(shù)來說,符合以下3條規(guī)則:
原碼:將十進制數(shù)字直接翻譯為二進制數(shù)
反碼:原碼的符號位不變,其他位按位取反
補碼:反碼+1
而對于整型來說,整型在內(nèi)存中實際上是以補碼的形式進行存儲的。
2.2 補碼的意義
有的同學可能就會問了,為什么計算機要發(fā)展出原碼、反碼、補碼這么多種碼呢?
這就與計算機對于整數(shù)的運算有關(guān)了。
CPU只有加法器,減法在運算時也會被視作一個數(shù)加另一個負數(shù)。考慮到整數(shù)的最高位是符號位,兩個整數(shù)中若包含負數(shù),以原碼直接相加得到的數(shù)一定是不對的。所以問題就變成了如何使得運算簡單而精確,既要處理符號位,又要只進行加法運算,達到以某一種二進制形式的“碼”直接相加就能得到正確結(jié)果。
下面,我們以60+(-18)為例,分別用原碼、反碼、補碼直接進行二進制的運算。
原碼運算:
00000000 00000000 00000000 00111100( 60的原碼)+ 10000000 00000000 00000000 00010010(-18的原碼)-------------------------------------------10000000 00000000 00000000 01001110(某個數(shù)的原碼)
顯然,得到了的原碼轉(zhuǎn)化為10進制是-78,并非正確答案42。
反碼運算:
00000000 00000000 00000000 00111100( 60的反碼)+ 11111111 11111111 11111111 11101101(-18的反碼)-------------------------------------------100000000 00000000 00000000 00101001 截取后32位: 00000000 00000000 00000000 00101001(某個數(shù)的反碼)
顯然,得到了的反碼轉(zhuǎn)化為10進制原碼是41,并非正確答案42,但是只與正確答案相差(+1),于是,我們就想將負數(shù)的反碼+1,即變成“補碼”來進行運算,而又正數(shù)的補碼是原碼本身,這時候我們看看會怎么樣呢?
補碼運算:
00000000 00000000 00000000 00111100( 60的補碼)+ 11111111 11111111 11111111 11101110(-18的反碼)-------------------------------------------100000000 00000000 00000000 00101010 截取后32位: 00000000 00000000 00000000 00101010(某個數(shù)的補碼)
顯然,得到了的補碼轉(zhuǎn)化為10進制原碼是42,我們得到了正確結(jié)果。
2.3 結(jié)論
綜上,我們發(fā)現(xiàn),只要將兩個整數(shù)使用補碼進行運算,就不需要考慮它們的符號位了,將它們的所有位直接簡單相加即可,就能得到正確的結(jié)果。
2.4* 負數(shù)二進制補碼的快速轉(zhuǎn)化
對于char類型整數(shù),-1用二進制補碼表示為
當我們已知一個負數(shù)的二進制補碼時,用比這個數(shù)多一位的、最高位為1、其他位全0、這里應(yīng)為9位的二進制數(shù)
直接減去-1的二進制補碼得
得到的數(shù)就是十進制(-1)的絕對值,也就是1,只要加上負號,就能快速得到這個負數(shù)二進制補碼的十進制原碼。
原理十分簡單,一個負數(shù)的 原碼加上補碼 = 原碼+反碼+1 = 所有二進制位全1再加1 = 多一位的、最高位為1、其他位全0
3. 大小端字節(jié)序
3.1 什么是大小端
在內(nèi)存中,數(shù)據(jù)的大小端存儲是在 字節(jié) 尺度上進行討論的
大端存儲模式:數(shù)據(jù)的 低位 保存在內(nèi)存的 高地址 ,數(shù)據(jù)的 高位 保存在內(nèi)存的 低地址
小端存儲模式:數(shù)據(jù)的 低位 保存在內(nèi)存的 低地址 ,數(shù)據(jù)的 高位 保存在內(nèi)存的 高地址
3.2 為什么有大端和小端之分
在計算機系統(tǒng)中,我們通常是以字節(jié)為單位存儲數(shù)據(jù)的,每個地址對應(yīng)一個字節(jié)。
一個字節(jié)為8bit,但是在C語言中除了8bit的char之外,還有16bit的short,32bit的int。另外,對于位數(shù)大于8位的處理器,例如16位和32位的處理器,由于寄存器寬度大于一個字節(jié),那么必然存在著如何將多個字節(jié)安排的問題。這邊導(dǎo)致了大小端存儲模式的誕生。
我們以int類型的數(shù) 0x01ff4218 為例(兩個十六進制位即為1個字節(jié)),看一下在大小端下這4個字節(jié)分別是如何分配的
3.3 寫一段代碼來判斷你的機器的大小端字節(jié)序
算法簡單概括:截取4個字節(jié)大小的int整型的1個字節(jié)的低位。若機器為大端字節(jié)序,該字節(jié)存儲0x00;若機器為小端字節(jié)序,該字節(jié)存儲0x01;
#include《stdio.h》//實現(xiàn)方法1int check1(){ int i = 1; return *(char*)&i;}
//實現(xiàn)方法2int check2(){ union check { int i; char c; }ch = {1}; return ch.c;}
int main(){ int ret = check1(); if (ret == 1) { printf(“小端
”); } else { printf(“大端
”); } return 0;}
責任編輯:haq
-
數(shù)據(jù)
+關(guān)注
關(guān)注
8文章
7242瀏覽量
91038 -
編程
+關(guān)注
關(guān)注
88文章
3682瀏覽量
94882 -
C++
+關(guān)注
關(guān)注
22文章
2117瀏覽量
74789
原文標題:C/C++編程知識:整型數(shù)據(jù)在內(nèi)存中的存儲!講解+示例
文章出處:【微信號:xx-cyy,微信公眾號:C語言編程基礎(chǔ)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
主流的 MCU 開發(fā)語言為什么是 C 而不是 C++?

C++學到什么程度可以找工作?
Spire.XLS for C++組件說明

EE-132:使用VisualDSP將C代碼和數(shù)據(jù)模塊放入SHARC存儲器中

EE-112:模擬C++中的類實現(xiàn)

C++新手容易犯的十個編程錯誤
內(nèi)存儲器主要用來存儲什么
使用OpenVINO GenAI API在C++中構(gòu)建AI應(yīng)用程序

邏輯內(nèi)存和物理內(nèi)存的區(qū)別
ostream在c++中的用法
串行電可擦除編程只讀存儲器AD24C64數(shù)據(jù)表
ModusToolbox 3.2在c代碼中包含c++代碼的正確步驟是什么?
C++中實現(xiàn)類似instanceof的方法

評論