2017-03-02 141 views
-1

我一直在学习一些关于二进制和记忆,我看着如何INT被写入,从我的理解是基本写入4个字节,其中已签署的最大数量是你的4个字节是127从4个字节构建一个有符号的整数?

byte a = Byte.MAX_VALUE; 
    byte b = Byte.MAX_VALUE; 
    byte c = Byte.MAX_VALUE; 
    byte d = Byte.MAX_VALUE; 

    System.out.println((a << 24) + (b << 16) + (c << 8) + (d << 0)); 

然后我每次左移一个字节(8位))。

但我得到的最大数量是2139062143而不是2147483647,这是为什么?

+1

因此,生产Integer.MAX_VALUE? – shmosel

+0

您正在打印0x7f7f7f7f。 – VGR

+0

INT_MAX是2147483647和-2147483648因为0需要一个点 – CSK

回答

1

在二进制,MAX_VALUE S代表每种类型的启动与一0位并继续所有的1位。这意味着,要获得Integer.MAX_VALUE,你需要一个0位后跟随31 1位:

Integer.MAX_VALUE: 01111111111111111111111111111111 

但是,你不生产这一点。您重复使用Byte.MAX_VALUE四次。这意味着你有一个0位后7 1位,然后是一个0位后7 1位等:

Byte.MAX_VALUE:  01111111 
Byte.MAX_VALUE×4:  01111111011111110111111101111111 (2,139,062,143) 

由于-1 s的单独的1位组成,你可以得到你想要什么一个Byte.MAX_VALUE跟着三个-1 S:

Byte.MAX_VALUE:  01111111 
-1:     11111111 
Byte.MAX_VALUE, -1×3: 01111111111111111111111111111111 

当您尝试COMBIN会出现第二个问题这些。当Java将负数byte转换为int时,它将成为负数int,这意味着大量的1将以二进制形式添加到其左侧。因此,您需要使用& 0xff(或Byte.toUnsignedInt)从每个byte中去除这些添加的位。

最好使用|而不是+,因为它更符合更精确的内容。你为什么要使用'+'

byte a = Byte.MAX_VALUE; 
byte b = -1; 
byte c = -1; 
byte d = -1; 

System.out.println(((a & 0xff) << 24) | ((b & 0xff) << 16) | ((c & 0xff) << 8) | ((d & 0xff) << 0)); 
+0

明白了。 -1&0xff给了我255,我需要127,255,255,255为了创建01111111111111111111111111111111,如果有符号数是负数或正数,第一位表示如果它是1,它将是负的。我对吗? – Jony

+0

但是如果我想要做到负面呢? – Jony

+0

是的。哪个负值? –

0

不,最高有效位必须为零,所有其他位都必须为1.这会给出0x7FFFFFFF,即2's complement中有符号的32位整数的最大值。

0

byte在-128和127之间被标记。所以-1是8。

由于转移<<在将byte提升为int之后完成,您将得到32个int -1。

所以做

int a = 0xFF; // Or 0b1111_1111 
int b = 0xFF; 
int c = 0xFF; 
int d = 0xFF; 

或做:

byte[] bytes = { (byte)-1, (byte)-1, (byte)-1, (byte)-1 }; 
int n = ByteBuffer.wrap(bytes).getInt(); 

所有的人一个可以作为获取:

int n = -1; 
int n = ~0; // Ones complement 
+0

http://stackoverflow.com/questions/2840190/java-convert-4-bytes-to-int但我完全喜欢这个答案,除了OR和AND运营商,这是我误解的东西?不应该使用值为127的4个字节为您提供有符号整数最大值,即2147483647 – Jony

+0

127为二进制0111_111,Byte.MAX_VALUE。所以不行。您可以将一个字节(通过移位操作扩展为int)作为:'(b&0xFF)<< ...'。 –

相关问题