不同类型的变量在内存中存储的详细情况
生活随笔
收集整理的這篇文章主要介紹了
不同类型的变量在内存中存储的详细情况
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
原文鏈接:http://blog.csdn.net/qingkong8832/article/details/6687793
一、int型變量在內存中存儲詳細情況
//By Richard #include <stdio.h> #include <math.h>int main() {int i1=0;int i2=1;int i3=-1;int i4=127;int i5=-127;int i6=128;int i7=-128;int i8=255;int i9=-255;int i10=256;int i11=-256;int i12=(int)pow(2.0,16)-1;//65535int i13=-(int)pow(2.0,16)+1;//-65535int i14=(int)pow(2.0,16);//65536int i15=-(int)pow(2.0,16);//-65536int i16=(int)pow(2.0,24)-1;//16777215int i17=-(int)pow(2.0,24)+1;//-16777215int i18=(int)pow(2.0,24);//16777216int i19=-(int)pow(2.0,24);//-16777216int i20=(int)pow(2.0,31)-1;//2147483647,最大值int i21=-(int)pow(2.0,31)+1;//-2147483647int i22=(int)pow(2.0,31);//超出范圍,溢出,從最小值-2147483648循環int i23=-(int)pow(2.0,31);//-2147483648,最小值/**************************************************************** 在return 0上打上斷點,F5開始調試,Alt+6查看內存* 要想查看哪個變量在內存中的存儲情況,在地址欄輸入&+變量名,比如說:&i1* int型占4個字節,注意:內存中的存儲順序和實際的字節表示剛好相反* 比如說:10,在內存中表示為0a 00 00 00,而實際中表示為00 00 00 0a* 負數的二進制數:對應的正數的二進制數每一位取反,再加1* int型最高位表示符號:1,表示負數,0表示正數(內存中的最后一個字節的第一位表示)* 具體來分析:* 0 :00 00 00 00* 1 :01 00 00 00* -1 :ff ff ff ff(00 00 00 01->ff ff ff fe->ff ff ff ff)* 127 :7f 00 00 00* -127 :81 ff ff ff(00 00 00 7f->ff ff ff 80->ff ff ff 81)* 128 :80 00 00 00* -128 :80 ff ff ff(00 00 00 80->ff ff ff 7f->ff ff ff 80)* 255 :ff 00 00 00* -255 :01 ff ff ff(00 00 00 ff->ff ff ff 00->ff ff ff 01)* 256 :00 01 00 00* -256 :00 ff ff ff(00 00 01 00->ff ff fe ff->ff ff ff 00)* 65535 :ff ff 00 00* -65535 :01 00 ff ff(00 00 ff ff->ff ff 00 00->ff ff 00 01)* 65536 :00 00 01 00* -65536 :00 00 ff ff(00 01 00 00->ff fe ff ff->ff ff 00 00)* 16777215 :ff ff ff 00* -16777215 :01 00 00 ff(00 ff ff ff->ff 00 00 00->ff 00 00 01)* 16777216 :00 00 00 01* -16777216 :00 00 00 ff(01 00 00 00->fe ff ff ff->ff 00 00 00)* 2147483647 :ff ff ff 7f*-2147483647 :01 00 00 80(7f ff ff ff->80 00 00 00->80 00 00 01)* 2147483648 :01 00 00 00 00(超出范圍)*-2147483648 :00 00 00 80(-2147483647減去1得到) ********同理可知道short型、long型情況*****************************************************************************/return 0; }二、unsigned int型存儲情況
//By Richard #include <stdio.h> #include <math.h>int main() {unsigned int i1=0;unsigned int i2=1;unsigned int i3=255;unsigned int i4=256;unsigned int i5=65535;unsigned int i6=65536;unsigned int i7=(unsigned int)pow(2.0,24)-1;unsigned int i8=(unsigned int)pow(2.0,24);//16777216unsigned int i9=(unsigned int)pow(2.0,31)-1;unsigned int i10=(unsigned int)pow(2.0,31);//2147483648unsigned int i11=(unsigned int)pow(2.0,32)-1;//4294967295unsigned int i12=(unsigned int)pow(2.0,32);//超出范圍,這里為0/************************************************************************ unsigned int占4個字節,只能表示正數* 最大為(int)pow(2.0,32)-1=4294967295* 當超出最大值后,從0開始往后循環* 0 :00 00 00 00* 1 :01 00 00 00* 255 :ff 00 00 00* 256 :00 01 00 00* 65535 :ff ff 00 00* 65536 :00 00 01 00* 16777215 :ff ff ff 00* 16777216 :00 00 00 01* 2147483647:ff ff ff 7f(01111111 11111111 11111111 11111111)* 2147483648:00 00 00 80(1000000 00000000 00000000 00000000)* 4294967295:ff ff ff ff************************************************************************/return 0; }三、char和unsigned char型討論
//By Richard #include <stdio.h>int main() {char c0=0;//00char c1=1;//01char c2=-1;//ff(01->fe->ff)char c3='A';//41 char c4=65;//41char c5=127;//7fchar c6=-127;//81(7f->80->81)char c7=128;//超出范圍char c8=-128;//80 unsigned char uc0=0;unsigned char uc1='A';//41unsigned char uc2=65;//41unsigned char uc3=127;//7funsigned char uc4=128;//80unsigned char uc5=255;//ffunsigned char uc6=256;//超出范圍,從0開始循環/********************************************* char范圍為-128到127,表示的ASCII碼有限* unsigned char范圍為0到255,能表示所有的ASCII碼* 在牽扯到讀取文件或寫文件,都定義成unsigned char型*********************************************/return 0; }四、float型討論
//By Richard #include <stdio.h>int main() {//float占4個字節float d0=0;float d1=1;float d2=-1;float d3=1.5;float d4=-1.5;float d5=11.9;float d6=0.2356;/********************************************************************** 0:00 00 00 00* 1:00 00 80 3f* -1:00 00 80 bf* 1.5:00 00 c0 3f*-1.5:00 00 c0 bf*詳細過程:*============================================================*4字節: 31 30 29-23(7位) 22-0(23位)* 表示:實數符號位 指數符號位 指數位 有效數位*=============================================================* 將一個float型轉化為內存存儲格式的步驟為:* 1,先將這個實數的絕對值化為二進制格式* 2,將這個二進制格式實數的小數點左移或右移n位,直至小數點移動到第一個* 有效數字的右邊* 3,從小數點右邊第一位開始數出23位,放入第22位到第0位* 4,如果實數是正的,則在第31位放入“0”,否則放入“1”* 5,如果n是左移得到的,說明指數是正的,第30位放入“1”。如果是右移得到的或* n=0,則第30位為“0”* 6,如果n是左移得到的,則將n減去1后化為二進制,并在左邊加0補足7位,放入* 第29到第23位。如果n是右移得到的或n=0,則將n化為二進制后在左邊加0補足7位* 再各位取反,之后放入第29到第23位*=============================================================* 舉例說明: 11.9的內存存儲格式 * (1) 將11.9化為二進制后大約是" 1011. 1110011001100110011001100..."。 * (2) 將小數點左移三位到第一個有效位右側: "1. 011 11100110011001100110 "。 * 保證有效位數24位,右側多余的截取(誤差在這里產生了 )。 * (3) 這已經有了二十四位有效數字,將最左邊一位“1”去掉,得到* “ 011 11100110011001100110 ”共23bit。將它放入float存儲結構的第22到第0位。 * (4) 因為11.9是正數,因此在第31位實數符號位放入“0”。 * (5) 由于我們把小數點左移,因此在第30位指數符號位放入“1”。 * (6) 因為我們是把小數點左移3位,因此將3減去1得2,化為二進制,并補足7位得到0000010,* 放入第29到第23位。 * 最后表示11.9為:|0 1 [00|0001|0] [011 |1110|0110|0110|0110|0110]* 對應的16進制為: 4 1 3 e 6 6 6 6* 內存存儲為:66 66 3e 41*================================================================* 再舉一個例子:0.2356的內存存儲格式*(1)將0.2356化為二進制后大約是0.00111100010100000100100000。 *(2)將小數點右移三位得到1.11100010100000100100000。 *(3)從小數點右邊數出二十三位有效數字,即11100010100000100100000放* 入第22到第0位。 *(4)由于0.2356是正的,所以在第31位放入“0”。 *(5)由于我們把小數點右移了,所以在第30位放入“0”。 *(6)因為小數點被右移了3位,所以將3化為二進制,在左邊補“0”補足七* 位,得到0000011,各位取反,得到1111100,放入第29到第23位。 * 最后表示0.2356:0 0 [11|1110|0] [111|0001|0100|0001|0010|0000]* 對應的16進制為: 3 e 7 1 4 1 2 0* 內存存儲為:20 41 71 3e************************************************************************/return 0; }?
轉載于:https://www.cnblogs.com/panweishadow/p/3529254.html
總結
以上是生活随笔為你收集整理的不同类型的变量在内存中存储的详细情况的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 九度OJ 1437 To Fill or
- 下一篇: highcharts第一篇---简介和使