#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 的倍數,這種對齊限制簡化了形成處理器和儲存器系統之間介面的硬體設計,並且提高了訪問效率,雖然可能浪費了空間。所以了解對齊,可以使我們在不降低效率的情況下以最低的空間儲存資料 不同的硬體結構對...