2016-02-04 16 views
1

我正在阅读试图了解如何将带符号字节转换为无符号整数计数器部分的示例。java - 为什么0x000F存储为无符号?

最流行的方法,我所遇到的是:

a & 0xFF 

哪里a是符号字节。

我的问题是为什么0xFF存储为无符号?是否所有十六进制值都存储为无符号?如果是这样,为什

“和” - 如何关闭符号整数的符号位?

如果有人能够逐步分解这个过程,那将会很棒。

+0

所以原始数据类型的整数是'int'? –

+0

你从哪里学习这种方法?它会将12345(一个非常好的非负的'int')转换为57.这是你想要的吗? – 5gon12eder

+3

'0xFF'是一个有符号的整数。这恰好是非负面的。 – resueman

回答

4

您可能在代码中看到了这一点,该代码将字节转换为整数,他们希望将该字节视为0-255范围内的无符号值。它通常不适用于整数。如果你想整a“签名”,你可以这样做:

int unsignedA = a & 0x7FFFFFFF; 

这将确保unsignedA是肯定的 - 但它确实是由斩去高位,因此,例如,如果a为-1 ,那么unsignedA是Integer.MAX_VALUE

无法将32位带符号Java整数转换为32位无符号Java整数,因为Java中没有32位无符号整数的数据类型。 Java中唯一的无符号整数数据类型是16位长:char

如果你想存储在Java中的32位无符号整数值,您需要将其存储在一个long

long unsignedA = a & 0xFFFFFFFFL; 
+0

@resueman你是对的,谢谢 –

+0

是的你是对的,我编辑了我的问题。我从这个答案中了解得更清楚。 http://stackoverflow.com/a/3388321/5826291 – Machina333

0

在Java中,文字(1,0x2A,等等)是正的,除非你明确表明它们是否定的。这就是我们直觉地写数字的方式。

上一个问题回答了您关于转换为无符号的问题。 Understanding Java unsigned numbers

2

详细阐述Erwin有关将字节转换为整数的答案:在Java中,byte是一个带符号整数类型。这意味着它的值在-128到127之间。如果您说:

byte a; 
int b; 
a = -64; 
b = a; 

该语言将保留该值;也就是说,它会将b设置为-64。

但是,如果你真的想把你的字节转换为0到255的值(我猜你称之为字节值的“无符号对应”),你可以使用a & 0xFF。以下是发生了什么事情:

Java不直接对byteshort类型进行算术运算。所以当它看到a & 0xFF时,它将双方转换为int。的a十六进制值,该值是一个字节,貌似

a  =  C0 

当它转换为一个32位整数,其值(-64)必须被保留,因此这意味着32位整数有在高24位中有1位。因此:

a  =  C0 
(int)a = FFFFFFC0 

但后来你“和”它与0xFF

a  =  C0 
(int)a = FFFFFFC0 
     & 000000FF 
     -------- 
a & FF = 000000C0 

,结果是范围为0至`了`255

相关问题