細談資料型別以及計算機儲存資料機制 一

2021-06-03 15:50:02 字數 2632 閱讀 7443

#include

int main()

無意看到以上**,發現自己也是一知半解的,這才決定弄透一點。

以下均為自己對網上資料的理解,希望對大家能有所幫助,有誤之處,還請海涵。

首先列舉下資料型別:(signed )int ,unsigned int ,float ,double ,char

注意點:

1.宣告無符號整型時,我們都加上unsigned int ,而宣告有符號整型時用signed int,

我們平常直接寫int,省掉了signed.

另外,unsigned若省略後乙個關鍵字,大多數編譯器

都會認為是unsigned int。

2.在計算機中,整數是以補碼形式存放的

(只是帶符號的整數採用補碼儲存表示的,浮點數另有其儲存方式

)。3.

無符號數沒有原碼、反碼和補碼一說。只有帶符號數才存在不同的編碼方式。

4.整形數運算,總是遵循乙個原則:小的往大的擴充套件

從小到大:short -> unsigned short -> int -> unsigned int  

下面說說各資料型別值的範圍

(32 bit operate system,通過開始——執行,輸入dxdiag 命令即可查到自己電腦系統位數):

(signed) int   :  -2^31 ~ 2^31-1(-2147483648 ~ 2147483647)

unsigned int  :    0 ~ 2^32-1   (0 ~ 4294967295)

既然只對signed int 才有所謂的原碼、反碼和補碼,那我們就對signed int 來分析,

碼制轉換規則:當 變數(前提是有符號整型)是非負數時,

其原碼、反碼和補碼表示都是一樣的。

當變數是負數時,其反碼是對原碼的除符號位外的其他位進行取反後的結果

(取反即如果該位為

0則變為

1,而該位為

1則變為

0的操作)。

而補碼是先求原碼的反碼,

然後在反碼的末尾位加

1 後得到的結果,即補碼是反碼+1。

例如:int a =32,其原碼為0x00000020,反碼、補碼均如此

例如:int a =32,其原碼為0x00000020,反碼、補碼均如此

int a=-6,其原碼為1000 0000 0000 0000 0000 0000 0000 0110

(開頭的1為符號位),即為0x80000006,

反碼即為0xfffffff9,補碼即為0xfffffffa(在反碼基礎上再加1).

注意點:1.碼制轉換後的數就應該理解成無符號型的了,不然只對有符號型整數轉換幹嘛

(即碼制轉換應用於無符號與有符號之間 的轉換問題上)。

2.要將計算機輸出的數值和我們所常用的數值區分開來。

例如:-(2^31-1)在%u下輸出

2147483649,該值大於2^31-1(但它不是int 下的值),

就不要被上面的取值範圍給搞迷惑了。

3.符號位也是要佔地方的。假如乙個8位的系統,a=-6,其原碼就該寫成1000 0110,

若寫成1 0000 0110,就很讓人費解,似乎符號位不佔空間似的,

個人覺得這種寫法不合理的,

而且我這種寫法更有利於理解值的範圍。

例如:上面提過int 範圍值為

-2^31 ~ 2^31-1,若按我的理解,

就是int 32位里第一位拿來做符號位,

當其為正數時,最大值為31個1,即2^31-1,

當其為負數時,數值部分也是31個1,那最小值應該

是-(2^31-1),

為何與上面不一致呢?

別忘了,開始就說過,計算機儲存有符號整數是採用補碼形式的。

即最小值對應的補碼是0x80000001,即為

2147483649,不信你可以執行試試。

那最小值-2^31是怎麼來的?待會兒再想。

現在再來解釋一下上面的小題目,也就容易了:

unsigned int a=32,其二進位制編碼為0x00000020

(為了簡便,這裡用十六進製制

hexadecimal[

'heksəˌdesiməl

]表示)

int b=-6,如上已經算出補碼

0xfffffffa,

a和b相加,按注意點裡第4項看,都往unsigned int 轉換。

二進位制相加可得0x0000001a(溢位位去掉),即為26,其為正數,

所以輸出%d,%u格式不會影響結果。

仔細除錯該小題,可得如下結果:

1.unsigned int 變數的值可以直接看成int 型裡的正值,

所以上面小題就可以直接看成int型的加減法。

當輸出結果為正值時,輸出格式%d,%u都一樣,負值當然就不一樣了。

2.如果c為int型,則輸出結果要滿足是在int型值範圍內,

不然可以依然應用 "結果1"法則。

若a=2147483649,b=-1,結果超出最大值

2147483647。

輸出格式為%u時,計算向平常的一樣,

輸出格式為%d時,明顯超過了值的範圍,電腦會怎麼輸出,

本人從執行結果看不出頭緒。

大家知道的,可以說說結果-2147483648是如何來的?

對C 資料型別計算機內儲存的理解

在看primer c 這本書的時候一直有乙個地方不理解 下面談談我自己的理解,希望大家能指導一下 通常計算機中儲存資料都是以上圖中的方式來儲存的,上圖中那四塊可以理解為乙個由4個位元組組成記憶體塊,其中乙個位元組等於8位 位元,所以上圖中的記憶體塊佔32位 位元 框框前面的數字應該是指向記憶體的位址...

Java資料型別以及儲存

code string str1 new string abc 資料儲存在堆中 string str2 new string abc 資料儲存在堆中 system.out.println str1 str2 比較引用位址是否相等 false system.out.println str1.equal...

關於計算機中資料型別儲存的對齊問題

許多計算機系統對基本資料型別的合法位址做出了一些限制,要求某種型別物件的位址必須是某個值k 通常是2,4 8 的倍數,這種對齊限制簡化了形成處理器和儲存器系統之間介面的硬體設計,並且提高了訪問效率,雖然可能浪費了空間。所以了解對齊,可以使我們在不降低效率的情況下以最低的空間儲存資料 不同的硬體結構對...