位运算(Java中的~)中前导零的个数实际上是如何工作的?[已关闭]

7fhtutme  于 2023-03-28  发布在  Java
关注(0)|答案(1)|浏览(106)

2天前关闭。
Improve this question
如果我提出的问题太基础了,我很抱歉,但我真的不明白,而且我的理论背景不是软件工程。
假设我们正在处理一个Java int,它是32位的。所以:
2 = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
我知道2的蒂尔德是2的位数。所以:
1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
我必须找出哪个正数是这个的二进制补码,也就是3,所以2 = -3
但我不明白的是。
当11111111 1111111 11111111 11111111 1111101表示-3\f25 -3\f25 -3\f25 billion-3(20亿)时,机器如何区分?
我无法理解这一点,因为它似乎违反了位和数字之间的内射行为。
我哪里搞错了?

omqzjyyz

omqzjyyz1#

作为一个无符号的32位数,该值将是4,294,967,293。
如前所述,Java没有32位无符号整数类型,因此对于Java来说,这个问题没有实际意义。
对于其他语言和其他机器,这个概念确实存在。你问“机器如何区分”,一般来说,答案是它不区分。这取决于低级程序员来决定11111111 1111111 11111111 1111101是指-3还是4,294,967,293.这样你就可以决定11111111111111111111111111111111111101加1的结果是4,294,967,294还是-2。这是相同的二补数加法。
在某些情况下,比如“compare”指令,比较对象是有符号的还是无符号的很重要。但是(同样,通常)这是由程序员决定编写“signed compare”还是“unsigned compare”来处理的。对于高级语言,这个决定隐含在所使用的数据类型中:有符号整数或无符号整数。

相关问题