#include
#include
intislittleend()
return0;
}int main (
)
執行結果:
負整數在記憶體的儲存: 負數以補碼的形式儲存問題1:
#include
#include
int main (
)
具體求步驟:%d 表示列印的是乙個有符號的十進位制的整數.
1>針對char a=-1 求解過程:
第一步:
先將a=-1的二進位製畫出來 int佔4個位元組32個bit位
a = -1; -1原碼:1000 0000 0000 0000 0000 0000 0000 0001
第二步:
因為a的前面是char型別 1個位元組佔8個bit位
char a=-1的二進位制位:1111 1111
第三步:
因為%d列印的是乙個十進位制有符號的整數(int)
1111 1111 1111 1111 1111 1111 1111 1111 (最高位補充的符號位) 因為char只有8個bit位,而int佔32個bit位,因此需要補充符號位
2>針對signed char b = -1求解過程:
代表的是有符號的型別,因此求解過程和char a=-1完全一樣;
第一步:
先將a=-1的二進位製畫出來 int佔4個位元組32個bit位
a = -1; -1原碼:1000 0000 0000 0000 0000 0000 0000 0001
第二步:
因為a的前面是char型別 1個位元組佔8個bit位
char a=-1的二進位制位:1111 1111
第三步:
因為%d列印的是乙個十進位制有符號的整數(int)
1111 1111 1111 1111 1111 1111 1111 1111 (最高位補充的符號位) 因為char只有8個bit位,而int佔32個bit位,因此需要補充符號位
3>針對unsigned char c = -1的求解過程:
第一步:
先將a=-1的二進位製畫出來 int佔4個位元組32個bit位
a = -1; -1原碼:1000 0000 0000 0000 0000 0000 0000 0001
第二步:
因為a的前面是char型別 1個位元組佔8個bit位
unsigned char a=-1的二進位制位: 1111 1111
第三步:
因為%d列印的是乙個十進位制有符號的整數(int)
0000 0000 0000 0000 0000 0000 1111 1111 (最高位補充的符號位) 因為char只有8個bit位,而int佔32個bit位,因此需要補充符號位
unsigned char 代表無符號整數,因此最高位補充的是0.
執行結果:
問題2:
#include
#include
int main (
)
求解步驟:第一步:
a=-128的二進位制: -128原碼: 1000 0000 0000 0000 0000 0000 1000 0000
第二步:
對於char a來說對應的二進位制占8個bit位,因此從第一步 -128補碼中擷取8個bit位 1000 0000
第三步:
%u列印的是十進位制無符號的整數(int) 1111 1111 1111 1111 1111 1111 1000 0000(最高位補符號位) 但是此時最高位的1不再是符號位 ,最終導致列印結果是乙個很大的整數
int ->char->unsigned int
執行結果:
問題3:
#include
#include
int main (
)
求解過程:%u代表列印無符號的十進位制整數
第一步:
a = -128的二進位制 : -128原碼 : 1000 0000 0000 0000 0000 0000 1000 0000
-128反碼: 1111 1111 1111 1111 1111 1111 0111 1111
-128補碼: 1111 1111 1111 1111 1111 1111 1000 0000
第二步:
char a = 128 擷取最後8個bit位 1000 0000 (此時最高位1代表的就是符號位,因為假如不是符號位,對於char型別的範圍是-128~127,沒有+128)
第三步:
%u列印的是十進位制無符號的整數(int) 1111 1111 1111 1111 1111 1111 1000 0000(最高位補符號位) 但是此時最高位的1不再是符號位 ,最終導致列印結果是乙個很大的整數
執行結果:
強調到底是32位作業系統還是64位作業系統,因為系統不同對應的記憶體位元組大小不同
問題4.
#include
#include
int main (
)
第一步:
第二步:
10原碼: 0000 0000 0000 0000 0000 0000 0000 1010
第三步:
問題5:
#include
#include
int main (
) system (
"pause");
return0;
}
i-- = i-=1 = i=i-1; i=0時i=-1
unsigned int i=-1表示乙個很大的正數,始終代表》=0
原則上 unsigned int 能不用就不用了,盡量用有符號型別
問題6.strlen 找 \0 (ascill 值為0的那個字元)
#include
#include
#include
int main (
)printf
("%d\n"
,strlen
(a))
;//找到\0即可對應的scill碼值為0 //255
system (
"pause");
return0;
}
strlen 假如長度是5,那麼對應的下標就是5 舉例:「abcdef」 長度為6,那麼對應下標為6的元素遇到\0.
-1 - i=0; -1原碼: 1000 0000 0000 0000 0000 0000 0000 0001
問題7.
#include
#include
int main (
) system (
"pause");
return0;
}
255+1=256
255原碼0000 0000 0000 0000 0000 0000 1111 1111
+1 0000 0000 0000 0000 0000 0000 0000 0001
然後由於i的型別為unsigned char 佔乙個位元組
1111 1111
+0000 0001
1 0000 0000 擷取1個位元組(8個bit位)又等於0
1.值得注意的地方: 當把整數的型別按照float型別來解析時, 會導致解析錯誤 :
#include
#include
intmain()
2.判定浮點數相等易出現的錯誤點:
兩個小數相除很可能是乙個無限小數,但是float/double記憶體空間是有限的.(浮點數在記憶體空間中的儲存是有限的), 實際在寫**的過程中利用進行相減看差值是否小於乙個預期的差值範圍之內.
#include
#include
int main (
)else
system (
"pause");
return0;
}
看二者的差值是否小於預期的值即可
#include
#include
#include
#define e 1e-4
intmain()
else
system
("pause");
return0;
}
整理:浮點數在記憶體的儲存存在一定的誤差,兩個浮點數字相除可能是無限的,但是float/double內的空間是有限的. 整數,浮點數在記憶體中的儲存
整數 符號數 計算機中的符號數有三種表示方法,即原碼,反碼和補碼。三種表示方法均有符號位和數值位兩部分,符號位都是用0表示 正 用1表示 負 而數值位表示方法各不相同。原碼 直接將二進位制按照正負數的形式翻譯成二進位制就可以。反碼 符號位不變,其他位按位取反即可得到。補碼 反碼加一得到補碼。在計算機...
浮點數在記憶體中的儲存
浮點數在記憶體中的儲存方式與整型數字是不同的,對浮點數的儲存實際上是對ieee754中規定的s m e的儲存。浮點數 float double long double 根據國際標準ieee754,任意乙個二進位制浮點數可以被表示成下面的形式 ieee754規定 對於32位的浮點數,最高的1個位元位為...
浮點數在記憶體中的儲存
浮點數在記憶體中的儲存 常見浮點數型別 float,double,long double.那麼浮點數在記憶體中又是如何儲存的呢,它會和整數一樣嗎?那它的小數點又是如何儲存的呢 int main 執行結果為 n和 pfloat在記憶體中明明是同一位置同一數字,為什麼浮點數和整數的讀取結果會不一樣.說明...