簡體   English   中英

“類型不匹配:無法將int轉換為字節”

[英]“Type mismatch: cannot convert int to byte”

我看到人們詢問有關錯誤“類型不匹配:無法將int轉換為字節”的問題。 但它們主要是由所涉及的算術運算引起的。

這是我的情況:
(當我想在Eclipse Kepler中使用位時會發生這種情況)

//java 7 binary literals

byte a =  0b01111111; //8-bit it compiles 

byte b =  0b10000000;  //8-bit error: Type mismatch: cannot convert int to byte.                        

byte c =  (byte) 0b10000000; //8-bit it works fine if casted.

問題是如果它是8位且最高位是1,那么編譯器會給出錯誤。 我想知道為什么。 前綴0b表示它是二進制文字,那么為什么編譯器將最高位數作為帶符號的int數字或類似的東西呢?

謝謝回答。

[EDIT3:]

byte a = -128; //a = 0xFF = 11111111 (8 bits), compiler says ok.
byte b = 0b11111111; //compiler error

[Edit2:按位&操作以某種方式觸發錯誤]

byte a = 0b00000000;  //8 bits
a = (a&0xFF);  //gives same error: Type mismatch: cannot convert int to byte
a = (byte)(a&0xFF); //it is fine to cast

[編輯1:截圖更新] 在此輸入圖像描述

在此輸入圖像描述

你有一點,懷疑這是關於簽名整數。 在Java中,所有整數類型( byteshortintlong )始終都是簽名的。 Java使用了兩個補碼來存儲帶符號(讀“全部”)的值。 這基本上意味着,如果任何類型的第一位(不是文字中指定的第一位,但存儲的第一位)是1,則該數字為負。 如果是0,那就是積極的。

第二件重要的事情是:Java中沒有BYTE文字。 int文本和long文本。 寫下的每個nubmer(無論是二進制(0b前綴),八進制(0前綴),十進制(無前綴)還是十六進制(0x前綴))都是整數文字,除非你附加一個L (小寫或大寫),它是long 沒有辦法直接寫下任何shortbyte

現在,這意味着,您記下的所有示例都是先創建一個int 你不在那里創建byte

所以,最后一部分是,如果你試圖將int存儲在一個byte會發生什么 - 沒有強制轉換或使用強制轉換。 如果你明確地進行演員,你基本上告訴Java只是忽略任何不適合的位。 它們將被削減 - 即使這會改變數字的值(例如,見下文)。 如果你不投射,比特仍然會被削減。 但是,如果它改變價值,Java就不會這樣做 - 以確保你真正意味着你在做什么。

要將此全部鏈接到問題的例外:
int 0b01111111是127
byte 0b01111111是127
- >轉換可能沒有任何溢出,所以即使沒有顯式轉換,Java也會這樣做

int 0b10000000是128
byte 0b10000000是-128
- >轉換時出現溢出,因此如果沒有顯式轉換,Java將拋出錯誤。

我認為java中的字節是有符號的,這會使0b10000000超出范圍。 127將是可能的最大字節,原因是負數的兩個恭維表示。

字節變量CAN保持值0b1000000,但由於它們是有符號的,因此表示整數值-128。 它無法轉換文字的原因是當你把它寫成沒有強制轉換的文字時,編譯器將其視為(int)0b10000000,它是整數值POSITIVE 128。

大於127的任何整數值都超出了一個字節的范圍,因為字節是有符號的,只能保存-128到127的整數值。這就是溢出的來源(要保持128,你需要第九位用於符號)。 只要有符號值的1為最高有效位,它就表示一個負數,因此為了將一個數字(如0b10000000)放入一個字節,您需要在文字中表示負值。 例如,值-128將等於int 0b11111111111111111111111110000000,因此您需要將其用作文字,否則,更簡單,只需將其顯式轉換為字節,如:(byte)0b10000000

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM