不同類型的變量在內存中存儲的詳細情況


一、int型變量在內存中存儲詳細情況

  1. //By Richard   
  2. #include <stdio.h>   
  3. #include <math.h>   
  4.   
  5. int main()  
  6. {  
  7.     int i1=0;  
  8.     int i2=1;  
  9.     int i3=-1;  
  10.     int i4=127;  
  11.     int i5=-127;  
  12.     int i6=128;  
  13.     int i7=-128;  
  14.     int i8=255;  
  15.     int i9=-255;  
  16.     int i10=256;  
  17.     int i11=-256;  
  18.     int i12=(int)pow(2.0,16)-1;//65535   
  19.     int i13=-(int)pow(2.0,16)+1;//-65535   
  20.     int i14=(int)pow(2.0,16);//65536   
  21.     int i15=-(int)pow(2.0,16);//-65536   
  22.     int i16=(int)pow(2.0,24)-1;//16777215   
  23.     int i17=-(int)pow(2.0,24)+1;//-16777215   
  24.     int i18=(int)pow(2.0,24);//16777216   
  25.     int i19=-(int)pow(2.0,24);//-16777216   
  26.     int i20=(int)pow(2.0,31)-1;//2147483647,最大值   
  27.     int i21=-(int)pow(2.0,31)+1;//-2147483647   
  28.     int i22=(int)pow(2.0,31);//超出范圍,溢出,從最小值-2147483648循環   
  29.     int i23=-(int)pow(2.0,31);//-2147483648,最小值   
  30.   
  31.     /*************************************************************** 
  32.     *   在return 0上打上斷點,F5開始調試,Alt+6查看內存 
  33.     *   要想查看哪個變量在內存中的存儲情況,在地址欄輸入&+變量名,比如說:&i1 
  34.     *   int型占4個字節,注意:內存中的存儲順序和實際的字節表示剛好相反 
  35.     *   比如說:10,在內存中表示為0a 00 00 00,而實際中表示為00 00 00 0a 
  36.     *   負數的二進制數:對應的正數的二進制數每一位取反,再加1 
  37.     *   int型最高位表示符號:1,表示負數,0表示正數(內存中的最后一個字節的第一位表示) 
  38.     *   具體來分析: 
  39.     *          0 :00 00 00 00 
  40.     *          1 :01 00 00 00 
  41.     *         -1 :ff ff ff ff(00 00 00 01->ff ff ff fe->ff ff ff ff) 
  42.     *        127 :7f 00 00 00 
  43.     *       -127 :81 ff ff ff(00 00 00 7f->ff ff ff 80->ff ff ff 81) 
  44.     *        128 :80 00 00 00 
  45.     *       -128 :80 ff ff ff(00 00 00 80->ff ff ff 7f->ff ff ff 80) 
  46.     *        255 :ff 00 00 00 
  47.     *       -255 :01 ff ff ff(00 00 00 ff->ff ff ff 00->ff ff ff 01) 
  48.     *        256 :00 01 00 00 
  49.     *       -256 :00 ff ff ff(00 00 01 00->ff ff fe ff->ff ff ff 00) 
  50.     *      65535 :ff ff 00 00 
  51.     *     -65535 :01 00 ff ff(00 00 ff ff->ff ff 00 00->ff ff 00 01) 
  52.     *      65536 :00 00 01 00 
  53.     *     -65536 :00 00 ff ff(00 01 00 00->ff fe ff ff->ff ff 00 00) 
  54.     *   16777215 :ff ff ff 00 
  55.     *  -16777215 :01 00 00 ff(00 ff ff ff->ff 00 00 00->ff 00 00 01) 
  56.     *   16777216 :00 00 00 01 
  57.     *  -16777216 :00 00 00 ff(01 00 00 00->fe ff ff ff->ff 00 00 00) 
  58.     * 2147483647 :ff ff ff 7f 
  59.     *-2147483647 :01 00 00 80(7f ff ff ff->80 00 00 00->80 00 00 01) 
  60.     * 2147483648 :01 00 00 00 00(超出范圍) 
  61.     *-2147483648 :00 00 00 80(-2147483647減去1得到)  
  62.     ********同理可知道short型、long型情況************ 
  63.     *****************************************************************/  
  64.   
  65.     return 0;  
  66. }  

 

二、unsigned int型存儲情況

  1. //By Richard   
  2. #include <stdio.h>   
  3. #include <math.h>   
  4.   
  5. int main()  
  6. {  
  7.     unsigned int i1=0;  
  8.     unsigned int i2=1;  
  9.     unsigned int i3=255;  
  10.     unsigned int i4=256;  
  11.     unsigned int i5=65535;  
  12.     unsigned int i6=65536;  
  13.     unsigned int i7=(unsigned int)pow(2.0,24)-1;  
  14.     unsigned int i8=(unsigned int)pow(2.0,24);//16777216   
  15.     unsigned int i9=(unsigned int)pow(2.0,31)-1;  
  16.     unsigned int i10=(unsigned int)pow(2.0,31);//2147483648   
  17.     unsigned int i11=(unsigned int)pow(2.0,32)-1;//4294967295   
  18.     unsigned int i12=(unsigned int)pow(2.0,32);//超出范圍,這里為0   
  19.   
  20.   
  21.     /*********************************************************************** 
  22.     *   unsigned  int占4個字節,只能表示正數 
  23.     *   最大為(int)pow(2.0,32)-1=4294967295 
  24.     *   當超出最大值后,從0開始往后循環 
  25.     *     0       :00 00 00 00 
  26.     *     1       :01 00 00 00 
  27.     *     255     :ff 00 00 00 
  28.     *     256     :00 01 00 00 
  29.     *     65535   :ff ff 00 00 
  30.     *     65536   :00 00 01 00 
  31.     *   16777215  :ff ff ff 00 
  32.     *   16777216  :00 00 00 01 
  33.     *   2147483647:ff ff ff 7f(01111111 11111111 11111111 11111111) 
  34.     *   2147483648:00 00 00 80(1000000 00000000 00000000 00000000) 
  35.     *   4294967295:ff ff ff ff 
  36.     ************************************************************************/  
  37.     return 0;  
  38. }  

三、char和unsigned char型討論

  1. //By Richard   
  2. #include <stdio.h>   
  3.   
  4. int main()  
  5. {  
  6.     char c0=0;//00   
  7.     char c1=1;//01   
  8.     char c2=-1;//ff(01->fe->ff)   
  9.     char c3='A';//41       
  10.     char c4=65;//41   
  11.     char c5=127;//7f   
  12.     char c6=-127;//81(7f->80->81)   
  13.     char c7=128;//超出范圍   
  14.     char c8=-128;//80   
  15.   
  16.     unsigned char uc0=0;  
  17.     unsigned char uc1='A';//41   
  18.     unsigned char uc2=65;//41   
  19.     unsigned char uc3=127;//7f   
  20.     unsigned char uc4=128;//80   
  21.     unsigned char uc5=255;//ff   
  22.     unsigned char uc6=256;//超出范圍,從0開始循環   
  23.       
  24.     /******************************************** 
  25.     * char范圍為-128到127,表示的ASCII碼有限 
  26.     * unsigned char范圍為0到255,能表示所有的ASCII碼 
  27.     * 在牽扯到讀取文件或寫文件,都定義成unsigned char型 
  28.     *********************************************/  
  29.     return 0;  
  30. }  



 

 

四、float型討論

  1. //By Richard   
  2. #include <stdio.h>   
  3.   
  4. int main()  
  5. {  
  6.     //float占4個字節   
  7.     float d0=0;  
  8.     float d1=1;  
  9.     float d2=-1;  
  10.     float d3=1.5;  
  11.     float d4=-1.5;  
  12.     float d5=11.9;  
  13.     float d6=0.2356;  
  14.   
  15.     /********************************************************************* 
  16.     *   0:00 00 00 00 
  17.     *   1:00 00 80 3f 
  18.     *  -1:00 00 80 bf 
  19.     * 1.5:00 00 c0 3f 
  20.     *-1.5:00 00 c0 bf 
  21.     *詳細過程: 
  22.     *============================================================ 
  23.     *4字節:    31          30      29-23(7位) 22-0(23位) 
  24.     * 表示:實數符號位  指數符號位   指數位        有效數位 
  25.     *============================================================= 
  26.     * 將一個float型轉化為內存存儲格式的步驟為: 
  27.     * 1,先將這個實數的絕對值化為二進制格式 
  28.     * 2,將這個二進制格式實數的小數點左移或右移n位,直至小數點移動到第一個 
  29.     *    有效數字的右邊 
  30.     * 3,從小數點右邊第一位開始數出23位,放入第22位到第0位 
  31.     * 4,如果實數是正的,則在第31位放入“0”,否則放入“1” 
  32.     * 5,如果n是左移得到的,說明指數是正的,第30位放入“1”。如果是右移得到的或 
  33.     *    n=0,則第30位為“0” 
  34.     * 6,如果n是左移得到的,則將n減去1后化為二進制,並在左邊加0補足7位,放入 
  35.     *    第29到第23位。如果n是右移得到的或n=0,則將n化為二進制后在左邊加0補足7位 
  36.     *    再各位取反,之后放入第29到第23位 
  37.     *============================================================= 
  38.     * 舉例說明: 11.9的內存存儲格式  
  39.     * (1) 將11.9化為二進制后大約是" 1011. 1110011001100110011001100..."。  
  40.     * (2) 將小數點左移三位到第一個有效位右側: "1. 011 11100110011001100110 "。  
  41.     *     保證有效位數24位,右側多余的截取(誤差在這里產生了  )。  
  42.     * (3) 這已經有了二十四位有效數字,將最左邊一位“1”去掉,得到 
  43.     *     “ 011 11100110011001100110 ”共23bit。將它放入float存儲結構的第22到第0位。  
  44.     * (4) 因為11.9是正數,因此在第31位實數符號位放入“0”。  
  45.     * (5) 由於我們把小數點左移,因此在第30位指數符號位放入“1”。  
  46.     * (6) 因為我們是把小數點左移3位,因此將3減去1得2,化為二進制,並補足7位得到0000010, 
  47.     *     放入第29到第23位。  
  48.     * 最后表示11.9為:|0  1  [00|0001|0] [011 |1110|0110|0110|0110|0110] 
  49.     * 對應的16進制為:   4       1     3      e    6    6   6    6 
  50.     * 內存存儲為:66 66 3e 41 
  51.     *================================================================ 
  52.     * 再舉一個例子:0.2356的內存存儲格式 
  53.     *(1)將0.2356化為二進制后大約是0.00111100010100000100100000。  
  54.     *(2)將小數點右移三位得到1.11100010100000100100000。  
  55.     *(3)從小數點右邊數出二十三位有效數字,即11100010100000100100000放 
  56.     *     入第22到第0位。  
  57.     *(4)由於0.2356是正的,所以在第31位放入“0”。  
  58.     *(5)由於我們把小數點右移了,所以在第30位放入“0”。  
  59.     *(6)因為小數點被右移了3位,所以將3化為二進制,在左邊補“0”補足七 
  60.     *     位,得到0000011,各位取反,得到1111100,放入第29到第23位。  
  61.     *  最后表示0.2356:0 0 [11|1110|0] [111|0001|0100|0001|0010|0000] 
  62.     *  對應的16進制為:   3      e     7      1    4    1    2    0 
  63.     *  內存存儲為:20 41 71 3e 
  64.     ************************************************************************/  
  65.     return 0;  
  66. }  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM