首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

定义(1 << 31)还是使用0x80000000?结果不同

在计算机中,(1 << 31) 和 0x80000000 都表示一个32位有符号整数的最小值。它们的结果是相同的,都等于 -2147483648。

(1 << 31) 是使用位运算符 << 将二进制数 1 向左移动 31 位得到的结果。在二进制中,1 表示为 00000000000000000000000000000001,将其向左移动 31 位后得到 10000000000000000000000000000000,即 0x80000000。

0x80000000 是一个十六进制数,表示为 10000000000000000000000000000000,即二进制中最高位为 1,其余位为 0。在计算机中,最高位为 1 表示该数为负数,因此 0x80000000 表示的是一个负数,即 -2147483648。

无论是使用 (1 << 31) 还是 0x80000000,它们的结果都是相同的,都表示一个32位有符号整数的最小值 -2147483648。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

代码里-3>>1是-2但3>>11,-32却又是-1,为什么?

我一直以为-3>>1结果是-1。所以打算思考一下这个问题。...] of the register into the left-hand n bits of the result asr和lsr不同之处在于,asr指令会在移位之后,将原来的最高位bit[31]重新赋值到结果里...整型数字的除法(-3/2为啥等于-1) 那么为啥-3/2等于-1,难道在做除法的时候不会用移位进行优化吗? 多说无益,只能按照套路来反汇编,还是一样的套路代码。...所以-3/2的时候,会先计算3/2,得到1之后再赋值成-1 还记得那个神奇的数字0x80000000(-2147483648)吗,0x80000000乘以-1依然是0x80000000如果是这个数字除以...0x80000000/2的步骤如下: 记录两个数字异或结果,如果两个数字的符号位不同,说明结果为负,反之为正 对0x80000000进行乘以-1处理,结果依然还是0x800000000x80000000

1.1K20
  • 【CSAPP】DataLab

    明确禁止使用任何控制结构,如if,do,while,for,switch等;定义使用任何宏;在此文件中定义任何其他功能;调用任何功能;使用任何其他操作,例如&&,||, - 或?...解决思路: 对于32位机器而言,最小的补码是-1:0xffffffff,整型数最小值为0x80000000。根据题目要求不能直接返回0x80000000。...如果x,y符号相同,则将标志位设为0(相同),并将其与y-x的符号位为0的结果进行按位与,得到1结果;如果x,y符号不同,则将标志位设为1不同),并将其与x的符号位为1结果进行按位与,得到1结果...这是因为0的相反数还是0,按位或运算得到的结果还是0,最高位也是0。所以可以先将x与~x+1进行异或操作,然后查看结果的第31位。...如果第31位为1,则说明x与~x+1异号,即x和- x的符号不同,否则说明x和- x的符号相同。

    16610

    Linux内核30-读写自旋锁

    1 读/写自旋锁概念 自旋锁解决了多核系统在内核抢占模式下的数据共享问题。但是,这样的自旋锁一次只能一个内核控制路径使用,这严重影响了系统的并发性能。...(1使用独占指令ldrex标记相应的内存位置已经被独占,并将其值存储到tmp变量中。 (2)判断tmp是否等于0。...(4)执行0减去tmp2,将结果写入tmp。因为tmp2的值有2个:0-更新成功;1-更新失败。所以正常情况,此时tmp的结果应该为0,也就是释放加锁成功。...(4)等于0成功,不等于0,则跳转到标签1处继续执行。 通过上面的分析可以看出,读写自旋锁使用bit31表示写自旋锁,bit30-0表示读自旋锁,对于读自旋锁而言,绰绰有余了。...但是,因为与ARM架构体系不同,所以具体的加锁和释放锁的实现是不一样的。在此,就不一一细分析了。

    1.4K20

    移位运算用法总结

    位运算总结 原文 一、位运算应用口诀 清零取位要用与,某位置一可用或 若要取反和交换,轻轻松松用异或 二、移位运算 它们都是双目运算符,两个运算分量都是整形,结果也是整形。...b = b1,a^b^a = b) 四、应用举例 判断整数a是奇数还是偶数 a&1 = 0 偶数 a&1 = 1 奇数 取整数a的第k位(k = 0,1,2,…len(str(a))),即a>>k...2; //把i里的值左移2位 也就是说,1的2进制是000…0001(这里1前面0的个数和int的位数有关,32位机器,gcc里有31个0),左移2位之后变成 000…0100,也就是10进制的4,所以说左移...i = i << 1; 那么,i在左移1位之后就会变成0x80000000,也就是2进制的100000…0000,符号位被置1,其他位全是0,变成了int类型所能表示的最小值,32位的int这个值是-2147483648...右移对符号位的处理和左移不同,对于有符号整数来说,比如int类型,右移会保持符号位不变,例如: int i = 0x80000000; i = i >> 1; //i的值不会变成0x40000000

    61820

    Linux内核同步机制之(五):Read Write spin lock

    ----------如果tmp不等于0,那么说明有read 或者write的thread持有锁,那么还是静静的等待吧。...其他thread会在unlock的时候Send Event来唤醒该CPU的 " strexeq %0, %2, [%1]\n" ----如果tmp等于0,将0x80000000这个值赋给lock...,否则持有锁,进入临界区 : "=&r" (tmp) ----%0 : "r" (&rw->lock), "r" (0x80000000)-------%1和%2 : "cc...strexpl %1, %0, [%2]\n"----如果tmp结果非负值,那么就执行该指令,将tmp值存入lock WFE("mi")---------如果tmp是负值,说明有write...32个bit的lock,0~30的bit用来记录进入临界区的read thread的数目,第31个bit用来记录write thread的数目,由于只允许一个write thread进入临界区,因此1

    1.6K30

    数据结构:数组内存模型

    那么下面就以 Java 语言中的一个例子来说明一下数组的内存模型,当定义了一个拥有 5 个元素的 int 数组后,来看看内存长什么样子。...0x80000000 + 4 × (0 + 2×1) = 0x80000008 所以回到一开始的那个面试问题里,行优先还是列优先存储方式会造成 data[0][1] 元素的内存地址不一样。...在 Java Collection 中,底层的数据结构其实还是使用了数组,一般在初始化的时候会分配一个比我们在初始化时设定好的大小更大的空间,以方便以后进行增加元素的操作。...数组 index 为 2 的地址位置,如下图所示: 红色的部分代表着执行完 System.arraycopy 函数的结果,最后执行 elementData[1] = 4; 这条语句: 因为这里涉及到了每个元素的复制...我们还是以下面的例子来解释。

    787100
    领券