zoukankan      html  css  js  c++  java
  • 关于0x80000000为什么等于-2147483648和负数在内存上储存的问题

    转载自大佬的博客https://blog.csdn.net/youyou362/article/details/72667951/

    1·先说明负数怎么储存

    (1)十进制负数是以其补码储存在内存上。

    验证:求-8在内存上以二进制形式1的个数

    思路是:拿变量,令值为1,与-8的二进制码的每一位做与运算,若与运算结果为1,则该位为1。

    代码:

    int NumberOf1(int n)
    {
        int count = 0;
        unsigned int  value = 1;
        while (value != 0)
        {
            if (value&n)
            {
                count++;
            }
            value = value << 1; //左移右边补0,当移完32为value为0.
        }
        return count;
    }

    结论:

    输入-8,结果为29。

    在32位系统上,-8的储存

    -8的储存是以-8的补码,储存在内存上。

    -8的原码 1000 0000 0000 0000 0000 0000 0000 1000

    取反 由于第一位是符号位 不用改变 得:1111 1111 1111 1111 1111 1111 1111 0111 

    补码=反码+1 得::1111 1111 1111 1111 1111 1111 1111 1000 

    得到1的数量正好为29,所以-8的补码就是-8储存在内存上的二进制码

    (2)但是在十六进制,负数在内存中储存的是原码

    验证:

    对int test = 0x80000001 (对应十进制为-1) 检查其内存上的1的个数,发现只有2个1

    故内存上原码为  1000 0000 0000 0000 0000 0000 0000 0001.

    对十六进制的-8也是2个1

    (3)我们来看看0x80000000的输出

    0x80000000 的二进制位

    原码 1000 0000 0000 0000 0000 0000 0000 0000

    若最高位为符号位,则为-0,可是输出int i = 0x80000000 发现i= -(2^31)

    原因是在十六进制中负数的二进制原码的最高位是符号位,后面的31位为序号位,不是值位。1后面的000 0000 0000 0000 0000 0000 0000 0000,表示序号1,表示负数中,从小到大的第一位。

    由于int的最小值为-2^31,排在负数从小到大的序号1,所以int i = 0x80000000 输出为 -(2^31)

    我们来看看0xFFFFFFFF

    原码 1111 1111 1111 1111 1111 1111 1111 1111

    最高位为1 ,为负数,序号位为第(2^31)-1位  (111 1111 1111 1111 1111 1111 1111 1111=(2^31-1) 所以0xFFFFFFFF为负数从小到大 第2^31-1位 ,即

    -2^31+2^31-1= -1    

    输出int i = 0xFFFFFFFF 为 -1 符合

    (4)十进制的补码也符合 符号位+序号位的原则

    就拿-8来做例子:

    -8的补码:1111 1111 1111 1111 1111 1111 1111 1000 可以看出最高位为1 序号位为第2^(31)-8位,(111 1111 1111 1111 1111 1111 1111 1000 = 2^(31)-8 )

    则该补码表示的值为2^31- 2^(31)-8 = -8  符合

    ------------------------------------------------------------------------

    相关知识点补充:

    十六进制用最高位作为符号位,1位负数,0为正数。

    负数的位右移运算:

    原则:若右移的数字为负值,则向右移动N位同时N个1补充在左边

    若为正值,则以N个0补充在左边
    ---------------------

  • 相关阅读:
    list和set的区别
    tcp与udp协议的区别
    c3p0的数据库连接池
    mysql的连接
    HAVING 的使用 及笛卡尔积
    break-跳出内循环
    求素数(范围自改)
    1-100累加
    1-100累乘
    类实例:飞机大战
  • 原文地址:https://www.cnblogs.com/wkfvawl/p/10063173.html
Copyright © 2011-2022 走看看