有關(guān)Java IO雜記

1. RandomAccessFile中writeInt的原理是什么?

先看源碼:

public final void writeInt(int v) throws IOException {
        write((v >>> 24) & 0xFF);
        write((v >>> 16) & 0xFF);
        write((v >>>  8) & 0xFF);
        write((v >>>  0) & 0xFF);
        //written += 4;
    }
  • “>>>” 表示無符號右移
  • “&”:表示與操作 1&0 =0 1&1 =1
  • “& 0xFF ”相當(dāng)于截?cái)啵驗(yàn)?xFF (16進(jìn)制) = 11111111(二進(jìn)制),這樣操作保留低8位數(shù)字,高為補(bǔ)0
    因?yàn)镽andomAccessFile中的write()方法每次只能寫入1個(gè)字節(jié),而int數(shù)據(jù)類型占用4個(gè)字節(jié),因此第1次寫入時(shí),先右移3個(gè)字節(jié),獲取高8位值,& 0xFF后將前面的0去掉,以此類推。
    舉例,int i = 2000,二進(jìn)制為00000000 00000000 00000111 11010000
    第1次右移24位,等于00000000 00000000 00000000 00000000,& 0xFF后獲取高八位為00000000
    第2次右移16位,等于00000000 00000000 00000000 00000000,& 0xFF后獲取第二個(gè)八位為00000000
    第3次右移8位,等于00000000 00000000 00000000 00000111,& 0xFF后第三個(gè)八位為00000111
    第4次不右移,00000000 00000000 00000111 11010000 & 0xFF后第四個(gè)八位等于11010000
    這樣就把這個(gè)數(shù)字依次寫入了。

2. 為什么java byte數(shù)值范圍是 -128-127?

  • 前提條件:一個(gè)字節(jié)有8位,第1位為符號位
  • 最大值為正數(shù),第1位為0,為使其最大,其他位補(bǔ)1,因此最大值等于01111111(毋庸置疑),為128
  • 最小值位負(fù)數(shù),第一位為1,為讓這個(gè)負(fù)數(shù)最小,其他位只能補(bǔ)0,因此最小值等于10000000,為-127
  • 注意01111111和10000000在這里都是補(bǔ)碼
    計(jì)算機(jī)都是用補(bǔ)碼表示的:補(bǔ)碼計(jì)算法定義:非負(fù)數(shù)的補(bǔ)碼是其原碼本身;負(fù)數(shù)的補(bǔ)碼是在其原碼的基礎(chǔ)上, 符號位不變, 其余各位取反, 最后+1
    有關(guān)補(bǔ)碼的介紹:
    https://blog.csdn.net/lusa1314/article/details/83268873
    http://www.itdecent.cn/p/4e5e335af57c

3. 十六進(jìn)制為FF對應(yīng)的java數(shù)值為-1?

注意計(jì)算機(jī)都是用補(bǔ)碼表示的
1的二進(jìn)制原碼、反碼、補(bǔ)碼為0000 0001
-1的二進(jìn)制原碼為1000 0001,反碼為1111 1110,補(bǔ)碼為1111 1111= FF(十六進(jìn)制)

再看一個(gè)數(shù)字-48,對應(yīng)的16進(jìn)制是什么?
原碼1011 0000 反碼 1100 1111 補(bǔ)碼 1101 0000= d0(十六進(jìn)制)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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