1?

vojdkbi0  于 2021-06-30  发布在  Java
关注(0)|答案(7)|浏览(291)

为什么? byte b = (byte) 0xFF 等于
integer -1 ?
前任:

int value = byte b = (byte) 0xFF;
System.out.println(value);

它会打印出来 -1 ?

nbewdwxp

nbewdwxp1#

字节是用java签名的。在二进制中,0x00是0,0x01是1,依此类推,但所有1(即0xff)都是-1,0xfe是-2,依此类推。请参阅2的补码,这是所使用的二进制编码机制。

1aaf6o9v

1aaf6o9v2#

因为java(和大多数语言)使用2的补码数学表示负整数值。在2的补码中,0xff(11111111)表示值-1。

lnxxn5zx

lnxxn5zx3#

约化模
字节=256 0xff=255
255/256->余数255
所以255-256=-1
简单的逻辑干杯

wnvonmuf

wnvonmuf4#

也许你的困惑来自于为什么 (byte)0xFF 在某种程度上等于 (int)0xFFFFFFFF . 这里发生的事情是从较小的有符号类型提升到较大的有符号类型会导致较小的值被符号扩展,从而将最高有效位复制到提升值的所有新位。一个无符号类型不会变为符号扩展,它们得到零扩展,新的位总是零。
如果它有助于你接受它,那么这样想吧,任何大小的整数都有一些“幻影”位,它们的意义太大而无法表示。它们在那里,只是没有存储在变量中。负数的位是非零的,正数的幻像位都是零当你把一个较小的值提升到一个较大的值时,这些幻像位就变成了实位。

k2fxgqgv

k2fxgqgv5#

如果您使用的是有符号的int,那么0xff=-1是由于2-补码。
这篇wiki文章对此进行了很好的解释,请参见右侧的表格:http://en.wikipedia.org/wiki/two%27s_complement

ngynwnxp

ngynwnxp6#

b 被提升为 int 在确定 system.out.println 打电话。
java中的所有字节都是有符号的。
有符号字节 0xff 表示值 -1 . 这是因为java使用2的补码来表示有符号的值。有符号字节 0xff 代表 -1 因为它最重要的一点是 1 (因此它代表一个负值)它的值是 -128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = -1 .

5n0oy7gb

5n0oy7gb7#

不仅仅是java做了2的数学补码。这就是我能想到的每一个微处理器和dsp做数学的方式。所以,它是每一种编程语言所表达的方式。

相关问题