zoukankan      html  css  js  c++  java
  • 不同类型的变量在内存中存储的详细情况

    原文链接: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;//65535
        int i13=-(int)pow(2.0,16)+1;//-65535
        int i14=(int)pow(2.0,16);//65536
        int i15=-(int)pow(2.0,16);//-65536
        int i16=(int)pow(2.0,24)-1;//16777215
        int i17=-(int)pow(2.0,24)+1;//-16777215
        int i18=(int)pow(2.0,24);//16777216
        int i19=-(int)pow(2.0,24);//-16777216
        int i20=(int)pow(2.0,31)-1;//2147483647,最大值
        int i21=-(int)pow(2.0,31)+1;//-2147483647
        int 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);//16777216
        unsigned int i9=(unsigned int)pow(2.0,31)-1;
        unsigned int i10=(unsigned int)pow(2.0,31);//2147483648
        unsigned int i11=(unsigned int)pow(2.0,32)-1;//4294967295
        unsigned 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;//00
        char c1=1;//01
        char c2=-1;//ff(01->fe->ff)
        char c3='A';//41    
        char c4=65;//41
        char c5=127;//7f
        char c6=-127;//81(7f->80->81)
        char c7=128;//超出范围
        char c8=-128;//80
    
        unsigned char uc0=0;
        unsigned char uc1='A';//41
        unsigned char uc2=65;//41
        unsigned char uc3=127;//7f
        unsigned char uc4=128;//80
        unsigned char uc5=255;//ff
        unsigned 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;
    }
  • 相关阅读:
    结巴分词 0.14 版发布,Python 中文分词库
    Lazarus 1.0.2 发布,Pascal 集成开发环境
    Android全屏 去除标题栏和状态栏
    服务器日志现 Android 4.2 传将添多项新特性
    Percona XtraBackup 2.0.3 发布
    长平狐 Android 强制设置横屏或竖屏 设置全屏
    NetBeans 7.3 Beta 发布,全新的 HTML5 支持
    CppDepend现在已经支持Linux
    GromJS 1.7.18 发布,服务器端的 JavaScript
    Apache OpenWebBeans 1.1.6 发布
  • 原文地址:https://www.cnblogs.com/panweishadow/p/3529254.html
Copyright © 2011-2022 走看看