zoukankan      html  css  js  c++  java
  • 关于二进制补码表示法的一些备忘

    几乎所有的计算机都使用二进制补码表示法来存储有符号整数,而不是用所谓的符号加绝对值表示法。

    1)非负整数的二进制补码为其原样,直接转化为二进制即为其二进制补码。

    也就是说,当你定义一个int n=1是,在计算机内存是以二进制补码的形式存放的,32位的cpu中,每个位的值为:0000....(总共31个0) 1  。

    而如果是int n=-28;那么在计算机内存中如何存储?

    2)负整数的二进制补码:绝对值取反后加1.

    则为:-28的绝对值对应的二进制表示:16+8+4=》11100 =》左边补全0直至32位。也就是000...(27个0)11100.

    取反:1111(27个11)00011

    加1:1111(27个11)00100

    故当看到一个内存里以1打头的而且是int类型的数据,那么首先可以判定,这是一个负整数。

    再举一例:

    int a=-2;

    printf(“%u”,a);

    会打印出多少呢?我们分析下:

    -2在内存中首先以二进制补码的形式存放,也就是111...(30个1)10 这种序列存放(因为:-2绝对值二进制:0000...(30个0)10 取反,111(30个1)01。加1:

    也就是111...(30个1)10 。

    而因为是以无符号整数形式输出,故直接输出一个巨大的正整数:4294967294。


    另外。。谈一谈二进制补码表示法的溢出。。

    假设用4个位来表示整数,那么其表示范围为:1000(-8)~0111(7)。

    那假设5+6在这里我们期望的值是11,可是计算机相应为-5,这是为什么呢?


    原来。是因为11不在4个位表示的范围里。5(0101)+6(0110)=1011.这就是在存储器里边的结果。然后当计算机把这个数据还原成整数时,步骤是:判断正负,正的不进行操作,负数取其补码。

    很显然,存储时首位为1,这是负数,取补码(取反后加1):0100+1=0101=5,加上符号:-5。。。







  • 相关阅读:
    MySQL单实例、多实例服务脚本
    Shell之case结构条件句
    Shell之函数
    Shell之条件测试
    Shell脚本数字比较与四则运算
    Shell之分支结构
    Shell之变量的数值计算与输入
    Shell之变量子串与变量替换
    表单和框架
    HTML部分标签和代码
  • 原文地址:https://www.cnblogs.com/iosDevZhong/p/4395239.html
Copyright © 2011-2022 走看看