当前位置: 首页 > 知识库问答 >
问题:

为什么0b1111_1111导致编译器错误“int不能转换为字节”而不是0b111_1111?[副本]

安高翰
2023-03-14
byte b = 0b1111_1111;
byte c = 0b111_1111;
byte d = 0b0111_1111;

我认为byte的意思是不能大于8位的容量。0B1111_1111是8位。

共有1个答案

阴福
2023-03-14

Java中的所有基本整数类型都是有符号的。确切地说,byteshortintlong是带符号的大尾序两个补码整数。这意味着它们从-2n-1运行到2n-1-1,其中n是一个字节(在Java中为byte.size)的-8位数,因此范围从-128到127。

您使用的数字总是一个整数;数字文字总是。但是,整数实际上是十六进制中的值0x000000FF。无法存储,因为它高于127。但是,您可以执行显式转换;您的值毕竟是由8位组成的。

byte b = (byte) 0b1111_1111

工作的原因是它忽略了该值左侧的24位。现在,如果您打印它,您将得到-1作为值,尽管0b1111_1111表示8位二进制补码形式的1。

如果您需要它来表示整数值255,那么您需要执行以下小技巧:

int i = b & 0xFF;
    null
 类似资料:
  • 问题内容: 遇到一个错误地使用 而不是 在其代码中的人,它没有显示为编译错误。 是因为 是相同的 ? 问题答案: 没有编译错误,因为它是有效的(尽管相当无用) 一元运算符 ,其使用方式与以下方式相同: Java语言规范中的相关部分是Unary Plus运算符+(第15.15.3节) 。它指定调用一元运算会导致操作数的一元数值提升(第5.6.1节)。这意味着: * 如果操作数是编译时类型的,,,或,

  • 问题内容: 为什么在下面的代码中没有出现编译错误?我得到一个有点混乱的地方。是因为它们有关系吗? 问题答案: 为什么在下面的代码中没有出现编译错误? 因为编译器只关心您要强制转换的表达式的静态类型。 看这两行: 您 知道在第二行中,由于第一行,该值仅引用类型的对象,而编译器则没有。对于所有的编译器知道(编译第二线时),它 可能 实际上已经: …哪里有扩展和实现的类。因此它是有效的(在编译时),以铸

  • 我尝试在编译器中运行此代码,它给出了“circle”的输出: 我没有将打印功能设置为虚拟,但它仍然具有相同的效果。这有什么原因吗?

  • 使用sizeof()打印变量的大小 为什么sizeof()返回int的大小,而不是短int,即2个字节?

  • 问题内容: 下面的代码可以快速编译和运行。 我希望这是一个编译错误,因为结构永远不能符合AnyObject。如以下通过无法编译的代码所示。 我知道某些类型(例如String)可能会发生桥接。这将转换引用类型的值类型。 在写这个问题时,我想知道投射对象的类型是什么,似乎它也以某种方式被桥接。 为什么允许这种类型的铸造?似乎期望引用类型的函数违反了约定。 在重构一些代码以支持值类型时,我偶然发现了这一

  • 问题内容: 如果我有一个字节变量: 为什么以下工作: …但这不是吗? 编译器第一理解为第二吗? [编辑] 我知道演员,但我想提请您注意 我认为它们是平等的,那么为什么编译器会有所不同呢?之间有什么区别 问题答案: 因为是的等效项,而的类型被提升为(JLS§5.6.2二进制数值提升),因此,如果不进行显式转换,则不能将其结果分配给它。 根据JLS,§15.26.2复合赋值运算符: 形式为E1 op