我试图在下面一行中找出位投射:
long a = (long) (int) (char) (-2)
我想将其表示为十六进制数
之前的是什么?
我试图从右向左投射,所以我只用1填充,结果是:0xfffffffe
我知道输出是fffe但为什么(O_o)?
提前致谢。
答案 0 :(得分:-1)
这就是我的示例代码:
// equal to question
long a = (long) ((int) ((char) (-2)));
//printing partial solutions
int number = -2;
char c = (char)number;
int i = (int)c;
long l = (long)i;
System.out.printf("number: %08x\n", number);
System.out.printf("char: %08x\n", (int)c); //cast to print
System.out.printf("int: %08x\n", i);
System.out.printf("long: %08x\n", l);
输出:
number: fffffffe
char: 0000fffe
int: 0000fffe
long: 0000fffe
int有4个Byte,char有2个Byte,long有8个Byte。
每0.5个字节是一个十六进制数[0到f] == [0到15]。 (2个十六进制数字是1个字节。)
演员不会将一个数字从一个范围转换为另一个范围。它将字节(位)从给定值切换到新值的范围。 (如果你从一个较大的范围内投射到一个超级范围内。)
会发生什么?
-2默认为int。你被转换为char(从4 Byte到2 Byte)。拳头2字节将削减。所以你的结果是0xfffe。 比你更大范围和零添加。 (什么都不会改变。)
所以,这就是为什么在三次演员之后-2将是0xfffe(数字:65534)的原因。