Java 中 byte 類型初始化

很早的時(shí)候由于工作需要,接觸過(guò)一點(diǎn) Java,于是有了這個(gè)坑,今天回頭看到自己在 Stackoverflow 上提的問(wèn)題發(fā)現(xiàn)了它,于是再記錄下。

在使用中,需要將 byte 類型的的每一位都置 1。我萬(wàn)萬(wàn)沒(méi)有想到這么一個(gè)簡(jiǎn)單的操作,在 Java 中有各種約束。

首先看看代碼:

// 方式 1
byte allBitsOne = 0xFF;
// 方式2
byte allBitsOne = (byte)0xFF; 
// 方式3
byte allBitsOne = 0xFFFFFFFF; 

上面的哪個(gè)方式可以達(dá)到將 byte 類型的每一位都置 1 的需求呢?答案就是 2,3。

為什么方式 1 不可以呢?

因?yàn)樵?Java 中,整型字面量(literal integers)是采用的固定的有符號(hào) 32 位整型來(lái)表示的。而 byte 類型在 Java 中又是一個(gè)有符號(hào)的 8 位類型,表示范圍是十進(jìn)制 -128~127。于是 0xFF 代表的十進(jìn)制 255 超過(guò)了 byte 類型的表示的范圍。

為什么方式 2 可以呢?

因?yàn)?0xFF 這個(gè) 32 位整型來(lái)說(shuō),低 8 位都是 1,現(xiàn)在用 (byte) 強(qiáng)制轉(zhuǎn)換一下,將其多余的高位都丟棄,于是剩下的 8 位都是 1 的 byte 賦值給左邊。

為什么方式 3 可以呢?

因?yàn)樵?Java 中,整型字面量(literal integers)是采用的固定的有符號(hào) 32 位整型來(lái)表示的。并且是采用的補(bǔ)碼的形式,那么對(duì)于 0xFFFFFFFF 它所表示的數(shù)的絕對(duì)值就是各位按位取反后 + 1,可以知道絕對(duì)值是 1,而最高位是符號(hào)位,于是表示的就是 -1,再根據(jù) byte 類型在 Java 中可以表示 -128~127,所以可以賦值,而 -1 在 byte 類型上就是每一位都是 1

我覺(jué)得坑有兩個(gè):

  1. 為什么 byte 類型在 Java 中要被設(shè)計(jì)成 Int8 而不是 UInt8?
  2. Java 的類型系統(tǒng)太不靈活了,看看人家 Swift 中的 literal
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容