很早的時(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