• 带符号整数


    多数平台使用补码表示带符号整数。

    1.带符号数值
    最高位(最左侧)是符号位,正数是0,负数是1。
    00000000 = +0
    10000000 = -0

    使用带符号数值的数字的数学运算是复杂的,因为简单的带符号整数的加法和减法不能按照无符号数字的方式进行。如:
    00000001(十进制1) 和 10000001 (十进制-1) 相加得到 10000010 (十进制-2),这是不正确的。

    2.反码
    反码方法采用无符号整数的相反代码生成相应的负值。求反把所有为0的位改变为1,把所有为1的位改变为0。
    00000001 的反码是 11111110 。

    同样,对于带符号数字,当执行数学操作时,反码数字会产生一些问题。有两种方式可以表示零值(00000000 和 11111111),反码数字的数学运算也是复杂的(它不允许进行标准二进制运算)。

    3.补码
    补码通过使用简单的数学技艺,解决了带符号数值和反码方法的数学运算问题。对于负整数数值,值的反码加上1就是它的补码。
    如:-1
    1) 得到 00000001 的反码,结果是 11111110
    2) 反码加上1,结果是 11111111

    对-2值进行相同处理,会得到 11111110 ,-3 会得到 11111101 。

    补码值从 11111111 (十进制-1) 开始递减,直到到达 10000000 , 它表示 -128 。对于多字节整数长度,规则相同。

    虽然这样看上去有些奇怪,但是它解决了带符号整数的加法和减法的所有问题。如
    值 00000001 (+1) 和 (11111111) (-1) 相加得到 00000000 ,并且带有进位值。在整数运算中进位值被忽略,所以最终的值确实是0。相同的硬件可以同时用于无符号值和带符号值的加法和减法操作。

    对于相同的位数,补码格式表示的值和数量和无符号整数对应的值的数量是相同的,但是必须把值分为正值和负值。因些,带符号整数的最大值是无符号值的一半。


    0xdcff
    1101 1100 1111 1111        
    1010 0011 0000 0000        反码
    1010 0011 0000 0001        补码, 除掉符号位,-8961

  • 相关阅读:
    Workerman开启ssl方法如下
    前端 -- 单选框内容影响复选框的隐藏与显示 附代码
    这些年写过的花式sql - 第3句 今日流失用户
    求二维子数组的和(剖析)
    Go 使用mencached缓存
    springcloud05——Zookeeper实现支付微服务
    【计算机网络】ip协议
    河南2022中国农民丰收节 国稻种芯:主会场有味漯河食品丰收
    【C语言】还有柔性数组?
    进程的状态
  • 原文地址:https://blog.csdn.net/xiaozhiwise/article/details/127109447