zoukankan      html  css  js  c++  java
  • 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;

    }

    更多内容请关注 http://www.cnblogs.com/fukajg/
  • 相关阅读:
    如何进行在线Post接口测试?
    如何作为手动测试人员进入自动化测试
    用于测试API的开发人员工具
    使用Eolinker API 监控将API升到一个全新的水平
    如何通过自动化随着时间的推移增加测试覆盖率
    如何使用eolinker管理api
    从手动测试转向自动测试
    API是什么以及它为什么重要
    关于API网关(二)成本
    软件可测试性
  • 原文地址:https://www.cnblogs.com/fukajg/p/2651847.html
Copyright © 2011-2022 走看看