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/
  • 相关阅读:
    nginx+tomcat负载均衡
    一个tomcat部署多个应用实例
    多级菜单存在同一张表,一次性把所有关系取出来
    关于ajax post请求,参数过大产生的问题解决 Java
    nginx 的 proxy_cache 缓存配置
    nginx 安装 lua_nginx_module 模块(nginx——lua 学习笔记1)
    nginx 反向代理
    nginx的共享字典项api(操作方法)
    sed 常用命令 网址
    Django之 数据库ORM
  • 原文地址:https://www.cnblogs.com/fukajg/p/2651847.html
Copyright © 2011-2022 走看看