很早的時(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è):
- 為什么 byte 類型在 Java 中要被設(shè)計(jì)成
Int8而不是UInt8? - Java 的類型系統(tǒng)太不靈活了,看看人家 Swift 中的 literal