Java 字节不带符号2';补语是什么?

Java 字节不带符号2';补语是什么?,java,primitive,Java,Primitive,既然byte、short和int是有符号的,为什么Java中的byte和short没有得到通常的处理?例如,0xff对于字节是非法的 这在之前已经讨论过,但我找不到这种情况的原因。如果您查看用于在有符号字节中存储-1的实际内存,那么您将看到它是0xff。然而,在语言本身中,0xff只是超出了一个字节的范围,而不是二进制表示。-1的二进制表示形式实际上将使用2的补码,但您将被屏蔽掉该实现细节 语言设计者的立场是,试图将255存储在只能保存-128到127的数据类型中应被视为错误 您在评论中询问Ja

既然byte、short和int是有符号的,为什么Java中的byte和short没有得到通常的处理?例如,0xff对于字节是非法的


这在之前已经讨论过,但我找不到这种情况的原因。

如果您查看用于在有符号字节中存储
-1
的实际内存,那么您将看到它是
0xff
。然而,在语言本身中,
0xff
只是超出了一个字节的范围,而不是二进制表示。
-1
的二进制表示形式实际上将使用2的补码,但您将被屏蔽掉该实现细节

语言设计者的立场是,试图将255存储在只能保存-128到127的数据类型中应被视为错误

您在评论中询问Java为什么允许:

int i = 0xffffffff;
文本
0xffffffff
int
文本,使用两个补码进行解释。不能对字节执行任何类似操作的原因是,该语言没有提供语法来指定文本类型为
byte
,或者确实是
short


我不知道为什么决定不提供更多的文字类型。我想这是出于简单的原因。该语言的目标之一是避免不必要的复杂性。

这是合法的,但您需要将其显式转换为byte,即(byte)0xff,因为它超出了范围。

字节的可能值范围为-128到127

可以将范围之外的值分配给变量,并默默地丢弃溢出,但这与其说是惯例,不如说是混乱

那么我们就可以:

byte b = 128;
if (b < 0) {
  // yes, the value magically changed from 128 to -128...
}
字节b=128;
if(b<0){
//是的,值神奇地从128变为-128。。。
}
在大多数情况下,最好让编译器告诉您该值超出范围,而不是像那样“修复”它。

您可以编写

int i = 0xFFFFFFFF;
但你不会写字

byte b = 0xFF;
由于0xFF是一个
int
值,而不是
字节
,因此它等于255。无法定义字节或短文字,因此必须强制转换它

顺便说一句,你能做什么

byte b = 0;
b += 0xFF;
b ^= 0xFF;
甚至


您可以直接设置一个字节,但令人惊讶的是,您必须使用更多的数字:

byte bad = 0xff; // doesn't work
byte b = 0xffffffff; // fine
逻辑是0xff隐式地为0x000000ff,这超出了一个字节的范围。(255)

这不是你得到的第一个想法,但它有一些逻辑。越长的数字越小(绝对值越小)


很高兴知道实施是二者的补充。那么为什么语言允许0xffff\u ffff表示int呢?谢谢。我最近意识到了隐式强制转换+=。在Java中,我同意0xff是int。它就是它。但通常0xff是有符号的8位,所以应该可以分配给字节。无论如何,我认为问题已经解决了——字节被实现为2的补码。缺少的是字节文本类型,所以0xFF只能由255实现。无法写入0xFF,它是没有强制转换的字节。c、 f.
0xFFL
是一个
long
您是对的。不管你怎么写。即字节b=(字节)0xFF;当然它会以-1的形式失败:-@EddieB你是说它会以
字节b=255的形式失败吗你可以写
字节b=-1@peter lawrey是的,先生。请注意,我是一名接受培训的JavaPhite{newword?}
byte bad = 0xff; // doesn't work
byte b = 0xffffffff; // fine
byte b = 0xffffffff; // -1 
byte c = 0xffffff81; // -127 
byte c = 0xffffff80; // -128