鍍金池/ 問答/Java  網(wǎng)絡(luò)安全/ 為什么 byte b = 0x80;報告類型不兼容,而byte b = 0x70

為什么 byte b = 0x80;報告類型不兼容,而byte b = 0x70沒有錯誤信息?

問題0:

//編程語言為java
//這句話會報告類型不兼容,可能修飾精度的編譯錯誤
byte b = 0x80;
//這句話則不會提示任何錯誤 
byte b = 0x70;

問題1:
0x80我們用通常的二進制(不涉及補碼)的形式表示應(yīng)該是1000 0000,請問這里二進制中的1是符號位嗎(因為我猜想上述問題可能和符號位有關(guān)。。。)?
問題2:
如果byte b = -10; 系統(tǒng)是先檢查-10的正負性然后計算補碼并存儲在計算機中嗎?還是說“正數(shù)的補碼是本身,負數(shù)的補碼是取反+1”這句話本身只是一個規(guī)律性的總結(jié)所以不能這么理解?
問題3:
如何解釋-2 和 4294967294 其實在內(nèi)存類保存的都是0xFFFFFFFE

回答
編輯回答
撿肥皂

byte 能夠存儲的數(shù)據(jù)范圍是 -128~+127,0x80 已經(jīng)超出這個范圍了,所以不兼容。

  1. 不是。0x80 是一個 int 類型的整數(shù),對應(yīng)的是 128,而不是負數(shù)。數(shù)字字面量除非后面加了 l 或者 L 來表示是一個 long 類型,否則就是 int 類型。
  2. byte b = -10; 時,系統(tǒng)認為 -10 是一個 int,而這個 int 正好在 -128~+127 范圍之內(nèi),所以把 byte 類型的 b 初始化為 -10。否則拋出異常。
  3. 如果內(nèi)存中是 0xFFFFFFFE,那么他比僅僅能表示 -24294967294,它可以表示一個/幾個字符,一段音頻片段,一幅圖畫片段,一個點,………等等。至于到底表示什么,在于程序。如果它表示的是一個變量,那么它具體的值取決于這個變量類型的定義。

如果你透視了內(nèi)存條某個空間的值是 10101000001010001010101,它到底表示什么,沒人知道。賦予它愿意的是程序,是代碼。

2017年6月26日 17:43
編輯回答
刮刮樂

問題1:如果0x80能表示成1000 0000,說明這種表示方法是無符號二進制表示,不涉及符號位,1不是符號位。

問題2:補碼是被定義的,不是規(guī)律性總結(jié)。byte b = -10這段代碼必然使用經(jīng)過解析和編譯執(zhí)行,然后存儲數(shù)據(jù),所以先檢查-10的正負性然后計算補碼是對的。

問題3:一塊內(nèi)存里有0xFFFFFFFE,這塊內(nèi)存其實可以被解釋成任意的意思,關(guān)鍵是看程序按那種規(guī)則進行解釋。如果把它看作是個無符號的整數(shù),那它就是4294967294,如果把它看作補碼,那就是-2。

2018年3月27日 18:45