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;
    }
  • 相关阅读:
    【个人杂谈】MacBook Pro的使用心得
    【网页加速】lua redis的二次升级
    使用Openresty加快网页速度
    中间件——canal小记
    Java面试总结(二)
    RedissonLock分布式锁源码分析
    面试总结
    Spring AOP小记
    谈谈个人网站的建立(八)—— 缓存的使用
    Kafka、Logstash、Nginx日志收集入门
  • 原文地址:https://www.cnblogs.com/panweishadow/p/3529254.html
Copyright © 2011-2022 走看看