为什么? byte b = (byte) 0xFF 等于integer -1 ?前任:
byte b = (byte) 0xFF
-1
int value = byte b = (byte) 0xFF; System.out.println(value);
它会打印出来 -1 ?
nbewdwxp1#
字节是用java签名的。在二进制中,0x00是0,0x01是1,依此类推,但所有1(即0xff)都是-1,0xfe是-2,依此类推。请参阅2的补码,这是所使用的二进制编码机制。
1aaf6o9v2#
因为java(和大多数语言)使用2的补码数学表示负整数值。在2的补码中,0xff(11111111)表示值-1。
lnxxn5zx3#
约化模字节=256 0xff=255255/256->余数255所以255-256=-1简单的逻辑干杯
wnvonmuf4#
也许你的困惑来自于为什么 (byte)0xFF 在某种程度上等于 (int)0xFFFFFFFF . 这里发生的事情是从较小的有符号类型提升到较大的有符号类型会导致较小的值被符号扩展,从而将最高有效位复制到提升值的所有新位。一个无符号类型不会变为符号扩展,它们得到零扩展,新的位总是零。如果它有助于你接受它,那么这样想吧,任何大小的整数都有一些“幻影”位,它们的意义太大而无法表示。它们在那里,只是没有存储在变量中。负数的位是非零的,正数的幻像位都是零当你把一个较小的值提升到一个较大的值时,这些幻像位就变成了实位。
(byte)0xFF
(int)0xFFFFFFFF
k2fxgqgv5#
如果您使用的是有符号的int,那么0xff=-1是由于2-补码。这篇wiki文章对此进行了很好的解释,请参见右侧的表格:http://en.wikipedia.org/wiki/two%27s_complement
ngynwnxp6#
b 被提升为 int 在确定 system.out.println 打电话。java中的所有字节都是有符号的。有符号字节 0xff 表示值 -1 . 这是因为java使用2的补码来表示有符号的值。有符号字节 0xff 代表 -1 因为它最重要的一点是 1 (因此它代表一个负值)它的值是 -128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = -1 .
b
int
system.out.println
0xff
1
-128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = -1
5n0oy7gb7#
不仅仅是java做了2的数学补码。这就是我能想到的每一个微处理器和dsp做数学的方式。所以,它是每一种编程语言所表达的方式。
7条答案
按热度按时间nbewdwxp1#
字节是用java签名的。在二进制中,0x00是0,0x01是1,依此类推,但所有1(即0xff)都是-1,0xfe是-2,依此类推。请参阅2的补码,这是所使用的二进制编码机制。
1aaf6o9v2#
因为java(和大多数语言)使用2的补码数学表示负整数值。在2的补码中,0xff(11111111)表示值-1。
lnxxn5zx3#
约化模
字节=256 0xff=255
255/256->余数255
所以255-256=-1
简单的逻辑干杯
wnvonmuf4#
也许你的困惑来自于为什么
(byte)0xFF
在某种程度上等于(int)0xFFFFFFFF
. 这里发生的事情是从较小的有符号类型提升到较大的有符号类型会导致较小的值被符号扩展,从而将最高有效位复制到提升值的所有新位。一个无符号类型不会变为符号扩展,它们得到零扩展,新的位总是零。如果它有助于你接受它,那么这样想吧,任何大小的整数都有一些“幻影”位,它们的意义太大而无法表示。它们在那里,只是没有存储在变量中。负数的位是非零的,正数的幻像位都是零当你把一个较小的值提升到一个较大的值时,这些幻像位就变成了实位。
k2fxgqgv5#
如果您使用的是有符号的int,那么0xff=-1是由于2-补码。
这篇wiki文章对此进行了很好的解释,请参见右侧的表格:http://en.wikipedia.org/wiki/two%27s_complement
ngynwnxp6#
b
被提升为int
在确定system.out.println
打电话。java中的所有字节都是有符号的。
有符号字节
0xff
表示值-1
. 这是因为java使用2的补码来表示有符号的值。有符号字节0xff
代表-1
因为它最重要的一点是1
(因此它代表一个负值)它的值是-128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = -1
.5n0oy7gb7#
不仅仅是java做了2的数学补码。这就是我能想到的每一个微处理器和dsp做数学的方式。所以,它是每一种编程语言所表达的方式。