為什麼int型別的 129轉換成byte型別的會變成

2022-11-22 17:15:25 字數 3840 閱讀 6543

1樓:中學知識快遞

“無雙少城主”的回答可以給個最佳。

2樓:無雙少城主

1. int型別一般是4個位元組,一個位元組有8位,這樣int型資料二進位制的完整形式有32位,而byte表示一個位元組,於是byte型別資料二進位制的完整形式有8位。

2. 二進位制資料在計算機內是以二進位制儲存的,要注意一點,計算機在儲存某個資料時,是儲存的資料的補碼,說明一下補碼與原碼關係,正數補碼與原碼相同,負數補碼是原碼減1後取反。

3. 根據上面闡述,129的原碼是00000000 00000000 00000000 10000001 ,負數最高位取1,那麼-129便是10000000 00000000 00000000 10000001 ,補碼計算:減1為10000000 00000000 00000000 10000000 ,再取反為11111111 11111111 11111111 01111111(最高位是符號位,不參與取反),現在轉換為byte,只有8位,於是只能保留低8位,前面24位丟去,得到01111111,這就對應著十進位制的127.

關於j**a中型別轉化運算 為什int型128轉換成 byte型就成了-128了呢?

3樓:晶魚小公舉

這個涉及補碼的知識。我先給你寫出結論:正數的補碼是本身的二進位制表示,負數的補碼=對應正數的二進位制反碼+1(反碼即二進位制的所以位取反),並規定首位為符號位不表示值,0為正1為負。

說了這麼一堆,有啥用呢?有!整數在計算機中就是以補碼的形式儲存的。

ok基礎有了我們來看看這個問題。int 型別的128,沒有問題,int儲存邊界遠比比128大。而轉化成byte型別,問題就來了。

我們先來看int型別的128的二進位制表示:0000-0000-0000-0000-0000-0000-1000-0000也就是它的補碼

轉化成byte型別表示為:

1000-0000

我們會發現這裡首位需要表示為值!但是遺憾計算機不會自動識別造型時的期望值。1000-0000在計算機中是一個補碼而並非一串正數二進位制。

我們對它取反得到0111-1111發現正是最大的byte型別值127,再加一得128,而首位為1,表示為負,即1000-0000表示的就是-128就是最小的byte值。

這也就是byte型別值介於-128~127的原因。後面一個方法是一樣的,不再贅述。

當然補碼的知識不止於此,有興趣可以在網上尋找有關資料。

4樓:匿名使用者

int符號位太高,位元組位太少,符號位被128賦值成1是負數

-128到127是一個位元組全部的數。

5樓:張ban仙兒

byte型別的取值範圍是-128~127

所以int轉換之後回丟掉多餘的部分-129變成-128而128變成127

6樓:aa彼岸花開

因為越界了。你可以看一下資料型別的範圍就明白了。128這個數已經超過了byte的範圍

7樓:百度網友

這個和編碼過程有關

網頁連結

8樓:輕狂看世界

紙醉金迷昏天黑地天昏地暗,燈紅酒綠,渾渾噩噩,哀鴻遍野,不見天日,暗無天日,暗淡無光,黯然傷神,惶惶不可終日,窮困潦倒,風餐露宿,吃不飽,穿不暖,吃了上頓沒下頓,缺衣少食,粗茶淡飯,舉步維艱,布衣蔬食,衣不蔽體,備受煎熬,萬劫不復。紙醉金迷昏天黑地天昏地暗,燈紅酒綠,渾渾噩噩,哀鴻遍野,不見天日,暗無天日,暗淡無光,黯然傷神,惶惶不可終日,窮困潦倒,風餐露宿,吃不飽,穿不暖,吃了上頓沒下頓,缺衣少食,粗茶淡飯,舉步維艱,布衣蔬食,衣不蔽體,備受煎熬,萬劫不復。

j**a中int資料型別轉byte型別,int數為-129,答案儘可能詳細

9樓:百度網友

int 是4位元組的, 用補碼儲存

-129: 原碼: 1000 0000, 0000 0000, 0000 0000, 1000 0001

反碼: 1111 1111, 1111 1111, 1111 1111, 0111 1110

補碼: 1111 1111, 1111 1111, 1111 1111, 0111 1111

轉成byte後, 高的3個位元組就被捨棄了, 剩最低的一個位元組也就是 0111 1111

十六進位制為 7f

無符號10進製為 127

有符號10進位制也是 127

10樓:百度網友

public static byte tobytearray(int isource, int iarraylen)

return blocalarr;}

在j**a中int轉byte型別,超出byte的範圍該如何計算,答案儘可能詳細

11樓:匿名使用者

short,byte轉int都是補零拉長,反過來,int轉byte時,取低八位,其餘丟掉.129轉換為byte時為1000 0001,為補碼形式,轉為原碼-127.

12樓:匿名使用者

程式要儘量避免溢位,這是原則,一旦溢位,再去研究值是什麼已經沒有意義。

以下大概給你說明一下:

一個位元組byte長8位,也就是2的8次方,換成2進位制後就是00000000~11111111

取值範圍就是那麼多,10進位制就是0~255。

如果更長的型別如int轉成更短的型別,那麼只保留短型別那麼多長度的資料。

假設型別a為9位,其某變數值為

0 1111 1111 ,10進製為255,轉成byte正好也是255

假設型別a變數值為

1 0000 0000 ,換算成10進製為256,轉成byte為0其中具體是截斷前面還是後面,是根據編譯工具和版本來決定的,不同的語言可能會有不同的定義。

這樣說你大概可以明白了吧?

13樓:在高椅古村看高達的辰砂

計算機執行的是補碼,也就是上文中得出的1000 0001是補碼,計算機執行時再轉換成原碼就是1111 1111,即-127.

j**a的型別轉換報錯: 不相容的型別: 從int轉換到byte可能會有損失

14樓:匿名使用者

0x80如果不記述的話就是作為int型別,int是第一位是有符號的,0x80 大於127的數字,所以佔用兩位,byte只能佔用一位,當然會出錯。 如果要使用int賦值byte 0x80必須使用負數。 或者使用byte進行強制轉換 byte a = (byte)0x80

j**a中為什麼兩個byte整數想加的結果超出表述範圍後強制轉換byte型別後會得到負數,具體過程

15樓:匿名使用者

byte

取值範圍 -128~127 最高位符號位

67 0100 0011

89 0101 1001

156 1001 1100

67+89=156變成了int型別 24個0 1001 1100 強制轉換成byte型別。砍掉了前面24個0。

還是 1001 1100,這個數在int型別中是156,但是在byte中就是-100。

具體看這裡:

(byte)

127 = 0111 1111

127+1 = 128,超範圍,上溢位,變成-128 1000 0000

那麼-128+1呢? ------> 1000 0001

所有156(int) = 1001 1100(byte)= -128 + 28 = -100。

byte陣列與int型別互相轉換的幾種方式