当前位置: 首页 > 面试题库 >

为什么字节在Java中不采用0xff?

包唯
2023-03-14
问题内容

为什么Java编译器不会让我把0xffbyte0xff是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

在正常情况下,你不能分配intbyte没有投。但是,如果要分配的值是文字,并且文字值在目标类型的范围内,则Java语言允许进行赋值 而无需
强制转换。文字的值隐式地从缩小intbyte

JLS§5.2中对此进行了描述,它定义了可以在分配中执行的转换:

“如果变量的类型是字节,短或字符,并且常量表达式的值可以用变量的类型表示,则可以使用缩窄的原始转换。”

如您所见,这 不仅 适用于文字。它适用于所有(编译时)常量表达式!

跟进

我阅读了声称0xff是的答案255,怎么回事?是不是1111 1111,是什么原因造成的0xff-128255与此无关的东西?

文字0xff是类型为的 整数文字intint文字的值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字母Ll(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