为什么Java编译器不会让我把0xff
成byte
,0xff
是8位长,而这正大小byte
的数据类型。
有人可以解释为什么1有效,为什么2不有效吗?
class a
{
public static void main(String[] args)
{
// 1 :: results in error
byte a = 0xff;
System.out.printf("%x\n",a);
//2 :: works fine
byte a = (int)0xff
System.out.printf("%x\n",a);
}
}
编辑 我读了答案,声称0xff是255,怎么办?不是吗1111 1111
,是什么导致0xff,-128或255或其他原因。为什么不将其视为1111 1111
字节,而不是将该字节的8位视为1。
在Java byte
类型是一个8位有符号整数类型与在范围内的值-128
来+127
。文字0xff
表示+255
哪个超出了该范围。
在第一个示例中,您试图为分配一个超出范围的值byte
。那是编译错误。
在第二个例子中,(byte)
投正在执行一个明确的收缩转换,去除整数的高位文字......给你的价值-127
在你的byte
变量。
实际上,第一个示例的情况要复杂得多。考虑一下:
byte a = 1; // OK
int i = 1;
byte b = i; // Compilation error
byte c = (byte) i; // OK
在正常情况下,你不能分配int
到byte
没有投。但是,如果要分配的值是文字,并且文字值在目标类型的范围内,则Java语言允许进行赋值 而无需
强制转换。文字的值隐式地从缩小int
为byte
。
JLS§5.2中对此进行了描述,它定义了可以在分配中执行的转换:
“如果变量的类型是字节,短或字符,并且常量表达式的值可以用变量的类型表示,则可以使用缩窄的原始转换。”
如您所见,这 不仅 适用于文字。它适用于所有(编译时)常量表达式!
跟进
我阅读了声称
0xff
是的答案255
,怎么回事?是不是1111 1111
,是什么原因造成的0xff
,-128
或255
与此无关的东西?
文字0xff
是类型为的 整数文字int
。int
文字的值0xff
实际上0000 0000 0000 0000 0000 0000 1111 1111
是二进制的,或者是十进制的+255。相反,整数值-128
具有位模式1111 1111 1111 1111 1111 1111 1000 0000
。
为什么不仅仅将其视为
1111 1111
该字节的8位而不是1?
因为0xff
是类型为的整数文字int
。它不是8位文字,因为Java中不存在8位文字。正如JLS§3.10.1所述:
“如果整数文字
long
带有ASCII字母L
或l
(ell)后缀,则为类型;否则为int
(§4.2.1)类型。”
问题内容: 为什么不带?为什么要带? 问题答案: 这是因为,在覆盖该方法中的接口,它不需要该对象是。 该接口指定了允许将对象写入流或基础存储的方法,但这可以通过序列化以外的其他过程来实现。该工具实现了此功能,但需要可序列化的对象。但是,它不能修改其实现的接口的签名。
问题内容: 看来,许多人已经开始用组合代替。这似乎很愚蠢,不幸的是,像Jenkins这样的工具无法为您做到这一点。那么,为什么git clone不采用refspec,就像git fetch一样? 具体来说,如果您希望在Jenkins上运行gerrit触发的构建任务,则需要确保工作空间存在,否则jenkins将无法检出包含gerrit更改的修订。这是因为gerrit使用的引用路径不在git克隆获取的
问题内容: 为什么在Java中不使用const关键字? 您能看到在Java语法中使用某些可传递const或不可变关键字的任何缺点,还是为什么选择了常见的繁琐方法? 您能看到关闭请求的 原因 ,Sun提供了任何解释吗? 问题答案: 您能看到关闭请求的原因吗,Sun是否提供任何解释? 是。Sun在请求本身中提供了三个为什么不对请求执行操作的原因。我引用: “目前尚无计划将此功能添加到Java中。除了蔓
声明浮动时,我们可以通过两种方式将其接受为浮动: 在一种情况下,我可以将所有两种类型的值标记为数据类型,但在另一种情况下,我不能这样做,这是不符合逻辑的。 为什么?
问题内容: 我可以通过将L附加到值来创建文字。为什么我不能以类似的方式创建字面量的short或byte?为什么我需要在转换时使用int文字? 如果答案是“因为C中没有短文字”,那么为什么C中没有短文字? 这实际上并没有以任何有意义的方式影响我的生活;写(短)0而不是0S很简单。但是这种矛盾使我感到好奇。这是当您深夜起床时困扰您的事情之一。有人在某个时候做出了设计决定,使得可以为某些原始类型输入文字
问题内容: 如果我有一个字节变量: 为什么以下工作: …但这不是吗? 编译器第一理解为第二吗? [编辑] 我知道演员,但我想提请您注意 我认为它们是平等的,那么为什么编译器会有所不同呢?之间有什么区别 问题答案: 因为是的等效项,而的类型被提升为(JLS§5.6.2二进制数值提升),因此,如果不进行显式转换,则不能将其结果分配给它。 根据JLS,§15.26.2复合赋值运算符: 形式为E1 op