杭州达内嵌入式培训火热招生中。。。|杭州达内c++培训火热招生中
您现在的位置: 杭州达内 >>C/C++>>C语言中的整数在内存中的格式
C语言中的整数在内存中的格式
杭州达内 - C/C++ 来源:未知 发布时间:2013-12-09 10:18

       
    在C语言中关于整数在内存中的相关格式,今天将给大家详细的讲解一下
    big endian 和 small endian
   
    在intel机器上都是采用的small endian即小端字节序,也就是地位的地址低,高位的地址高。
   
    int i = 0x12345678
   
    char c1 = *(char*)(&i)
   
    一个int型整数的地址就是其较低位的地址,所以上例中c1的值就是0x78
   
    那么整数的正数,负数,以及无符号整数的表示方法有什么区别呢
   
    对于正整数来说,内存里装的就是它自己的二进制码
   
    0x12345678 = > 0001 0010 0011 0100 0101 0110 0111 1000
   
    求反 1110 1101 1100 1011 1010 1001 1000 0111
   
    +1 1110 1101 1100 1011 1010 1001 1000 1000
   
    结果 0xedcba988
   
    而负数呢,是对齐相应的整数,逐位求反,然后+1.
   
    负数的较高位都是1,不是规定的,而是算出来的结果,较高位必为1.
   
    根据上述算法-1 不是0x80000001 而是0xFFFFFFFF.
   
    下面相应的介绍一下左移《和右移》的计算。
   
    左移:
   
    #include <stdio.h>
   
    #include <stdlib.h>
   
    int main(){
   
    int a = 0x80000001;
   
    int b = 0x70000000;
   
    int c = 1;
   
    printf(“a:%x(%d)\n”, a《1, a《1);
   
    printf(“b:%x(%d)\n”, b《1, b《1);
   
    return 1;
   
    }
   
    a:80000000(-2147483648)
   
    b:2(2)
   
    左移相对比较简单,是不考虑符号位的,符号位也会被移除,正数可能左移成负数,负数也可能编程正数
   
    而右移呢,就需要考虑符号位了。右移过程中符号位保持不变,但注意符号位如果是1也是右移给右侧一位的,虽然自己不变。
   
    int main(){
   
    int b = 0x80000001;
   
    printf(“b:%x\n”, b》1);
   
    return 1;
   
    }
   
    [zhouqz@fb119 ~]$ ./a.out
   
    b:c0000000
   
    上例的结果既不是0x40000000也不是0x00000000,居然是0xc0000000(1100 0000 0000 …)
   
   左移来说,没有任何区别,但对于右移来说,因为无符号整数表示较高位不是符号位,右移就可以移动了
   
    所以0x80000000 》 1 就是0x40000000了
   
   达内小提示:利用上面的特点,我们可以很技巧的判断一个给定的子网掩码是不是合法的掩码,什么是合法的呢?就是从左开始一直是1,一旦遇到0后,后续的不能再有1的出现。
   
    int is_netmask_valid(int mask){
   
    if(((mask 》 1) & mask) == mask){
   
    return 1;
   
    }
   
    return 0;
   
    }
   
    注意参数必须是int不能是unsigned int,因为要利用右移保留符号位的特性。
   
    道理比较简单,就是子网掩码一定是1…10…0的格式,右移之后,1的个数会多一个,但是和原来的mask做&操作后还是mask,如果mask是非法的,0与0之间一定混有1,一旦 右移又与操作后,就会多出2个1,就会不等于原来的mask了
   
    怎么求一个合法的掩码的位数呢?
   
    int get_bit_of_netmask(int mask){
   
    int i = 0;
   
    while(mask){
   
    mask = mask 《 1;
   
    i++;
   
    }
   
    return i;
   
    }


<< 上一篇:没有了 >> 下一篇:C++培训技术内容:C++内存池的实现
相关标签:C++(105)
 达内简介 达内就业 达内课程 联系我们 网站导航
杭州达内为上软件有限公司 Copyright @ 2007-2012 版权所有 苏ICP备10118953号-1
分享到: