整數和浮點數在記憶體中的儲存

2021-10-08 18:22:12 字數 4634 閱讀 3921

#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在記憶體中明明是同一位置同一數字,為什麼浮點數和整數的讀取結果會不一樣.說明...