【发布时间】:2013-05-22 10:16:10
【问题描述】:
由于 SE 7 Java 允许将值指定为二进制文字。文档告诉我“字节”是一种可以容纳 8 位信息的类型,值 -128 到 127。
现在我不知道为什么,但如果我尝试将二进制文字分配给 Java 中的一个字节,我无法定义 8 位,而只能定义 7 位,如下所示:
byte b = 0b000_0000; //solves to the value 0
byte b1 = 0b000_0001; //solves to the value 1
byte b3 = 0b000_0010; //solves to the value 2
byte b4 = 0b000_0011; //solves to the value 3
以此类推,直到我们使用这 7 位得到最后几种可能性:
byte b5 = 0b011_1111; //solves to the value 63
byte b6 = 0b111_1111; //solves to the value 127
如果我想让它变成负数,我必须在前面添加一个前导 - 像这样:
byte b7 = -0b111_1111; //solves to the value -127
现在我遇到的一半问题是我只使用 7 位来描述他们告诉我的是 8 位数据类型。后半部分是,除非使用 32 位 int 类型,我可以定义所有 32 位(包括“符号指示位”),否则它们似乎不会作为二进制补码进行线程化。
现在,当我搜索如何显示范围内的数字 -128 时,我被告知这样做没有任何进一步的解释:
byte b8 = 0b1111_1111_1111_1111_1111_1111_1000_0000;
我可以清楚地看到最后 8 位 (1000 0000) 确实表示使用 8 位的二进制强制 -128,但我仍然从未感到困惑并尝试问我的问题:
- 上面的 32 位长 nr 不是 32 位 (java-) int 值吗?
- 为什么我可以将 32 位值分配给 8 位 (java-) 字节类型?
或者一般来说:为什么我必须这样分配它?
任何有关此的链接/信息都会很棒! 感谢您花时间阅读本文以及提前了解更多信息。
问候 一月
【问题讨论】:
-
byte b8 = 0b1000_0000工作,同时查找 2 的补码二进制表示 -
No byte b8 = 0b1000_0000 不起作用,不幸的是我失去了对这个问题的科学关注,但我认为这预计不起作用。然而有趣的是,这个问题从来没有完整的答案,需要检查如何设置奖励。
标签: java binary byte literals twos-complement