2011-04-11 80 views
3

我無法瞭解以下信息:鑄造長字節在Java中

在java中,

long l = 130L; 
byte b = (byte)l; 

如果我打印b的值,爲什麼會-126? long l的位表示是什麼?

+2

我不認爲代碼編譯,甚至 – OscarRyz 2011-04-11 16:01:52

回答

6

字節在Java中籤名 - 所以值的範圍是-128到127(含)。

當130簡單地截斷爲8位時,130的位模式是-126作爲一個字節的位模式。

另一個例子:

int x = 255; 
byte b = (byte) x; // b is now -1 
+0

謝謝喬恩。但是l的位值是多少? 130的二進制等於'10000010',那麼截斷在這裏如何發生? l被截斷後的值是多少?-126 ..? – Pan 2011-04-11 16:08:24

+0

@潘:這正是位模式...在2的補碼(http://en.wikipedia.org/wiki/Two's_complement)爲8位值是-126。你是否理解我的例子,其中'11111111'最終爲-1?這是完全一樣的原則。 – 2011-04-11 16:09:15

2

你的意思是byte b = (byte)l

Java的類型是帶符號的,所以字節允許-128到+127之間的數字。

12

一個字節是一個8位的序列,它使得2^8個案例= 256.其中一半代表負數,即-128到-1。然後是0,大約一半,1到127代表正數。

130爲INT貌似128 + 2是:

0000:0000 1000:0000 (128) 
0000:0000 0000:0010 (2) 
0000:0000 1000:0010 (130) 

然而,字節剛剛8位數字,並且因爲它們是分配只需位,但剛剛過去的:

1000:0010 

第一位表示它是負數。現在你需要添加多少才能達到零?讓我們逐步完成:

1000:0010 x + 
0000:0001 1 = 
---------------- 
1000:0011 (x+1) 

1000:0011 (x+1) + 
0000:0001 1 = 
---------------- 
1000:0100 (x+2) 

讓我們做更大的步驟。只需添加我們有零1秒,但首先我們回到X:

1000:0010 x + 
0111:1101 y = 
-------------- 
1111:1111 

現在有一個轉折點:我們再添1,並得到零(加上溢)

1111:1111 (x + y) + 
0000:0001 1 
--------- 
0000:0000 0 

如果(x + y)+ 1 = 0,x + y = -1。有趣的是,負1不僅與1(0000:0001)具有'負旗'('1000:0001')相同,但看起來完全不同。然而,第一個位置總是告訴你這個符號:1總是表示否定的。

但是我們之前添加了什麼?

0111:1101 y = ? 

它在第一個位置沒有1,所以它是一個正值。我們知道如何解構?

..f:8421 Position of value (1, 2, 4, 8, 16=f, 32, 64 in opposite direction) 
0111:1101 y = ? 
..f 84 1 = 1+4+8+16+32+64= 125 

而現在很明顯:X + 125 = -1 => X = -126

您可以在頂部(正午)想象中的值,轉了一圈主辦,0和正值的排列方式類似於從0到5的時鐘(但是到127),而底部的轉折點(127 + 1 => -128 [sic!]。)現在,您可以順時針旋轉,加1導致 - 127,-126,-125,... -3,-2,-1(在11點鐘),最後再在頂部0。

對於更大的數字(小,int,long)需要更大的時鐘,零始終在最上面,最大和最小總是在最下面。但是,即使一個字節是太大了,使圖片,所以我做了,一個半字節半字節之一:

bitpatterns of integer, arranged in circle form

您可以輕鬆地填寫畫面上的孔,這是小事!

btw .:整件事不叫鑄造。鑄造僅用於對象之間。如果你有什麼東西,這是真正的子類型:

Object o = new String ("casting or not?"); 

這只是一個賦值,因爲字符串是(總是)一個對象。沒有涉及鑄件。

String s = (String) o; 

這是鑄件。更具體的類型。並非每個對象都是一個String。整數提升有一個小關係,因爲每個字節都可以無損地轉換爲長整型,但不是每一個字節都長。但是,即使是Byte和Long,對象類型也不會相互繼承。

你只是沒有得到警告,對

byte s = (byte) 42; 
long o = s; // no problem, no warning 
byte b = (byte) o; // written like casting 
+0

+1,還沒有看到這個描述性答案! – asgs 2011-04-11 18:32:18

+0

這應該是被接受的答案,非常翔實。 感謝您的努力! – 2016-10-31 16:58:57