Wei*_*eng 9 java byte bit-manipulation
我看到人们询问有关错误"类型不匹配:无法将int转换为字节"的问题.但它们主要是由所涉及的算术运算引起的.
这是我的情况:(
当我想在Eclipse Kepler中使用位时会发生这种情况)
//java 7 binary literals
byte a = 0b01111111; //8-bit it compiles
byte b = 0b10000000; //8-bit error: Type mismatch: cannot convert int to byte.
byte c = (byte) 0b10000000; //8-bit it works fine if casted.
Run Code Online (Sandbox Code Playgroud)
问题是如果它是8位且最高位是1,那么编译器会给出错误.我想知道为什么.前缀0b表示它是二进制文字,那么为什么编译器将最高位数作为带符号的int数字或类似的东西呢?
谢谢回答.
[EDIT3:]
byte a = -128; //a = 0xFF = 11111111 (8 bits), compiler says ok.
byte b = 0b11111111; //compiler error
Run Code Online (Sandbox Code Playgroud)
[Edit2:按位&操作以某种方式触发错误]
byte a = 0b00000000; //8 bits
a = (a&0xFF); //gives same error: Type mismatch: cannot convert int to byte
a = (byte)(a&0xFF); //it is fine to cast
Run Code Online (Sandbox Code Playgroud)
[编辑1:截图更新]


Joh*_* H. 11
你有一点,怀疑这是关于签名整数.在Java中,所有整数类型(byte,short,int,long)始终签名.Java使用了两个补码来存储带符号(读"全部")的值.这基本上意味着,如果任何类型的第一位(不是文字中指定的第一位,但存储的第一位)是1,则该数字为负数.如果是0,那就是积极的.
第二件重要的事情是:Java中没有BYTE文字.有int文字和long文字.写下的每个nubmer(无论是二进制(0b前缀),八进制(0前缀),十进制(无前缀)还是十六进制(0x前缀))都是整数文字,除非你附加一个L(小写或大写),它就是long.没有办法记下任何short或byte直接.
现在,这意味着,你写下的所有这些例子都在创造int第一个.你不在byte那里创建.
所以,最后一部分是,如果你试图将它存储int在一个内部会发生什么byte- 没有铸造或铸造.如果你明确地进行演员,你基本上告诉Java只是忽略任何不合适的位.它们将被削减 - 即使这会改变数字的值(例如,见下文).如果你不投射,比特仍然会被削减.但是,如果它改变价值,Java就不会这样做 - 以确保你真正意味着你在做什么.
要将这一切都链接到问题的例外:
int 0b01111111127
byte 0b01111111是127
- >转换可能没有任何溢出,所以即使没有显式转换,Java也会这样做
int 0b10000000是128
byte 0b10000000是-128
- >转换时出现溢出,因此如果没有显式转换,Java将抛出错误.