KDOC 206: バイト数を直感的に把握する

この文書のステータス

  • 作成
    • 2024-07-30 貴島
  • レビュー
    • 2024-08-01 貴島

概要

CPUまわりの本を読んでいると、よく1バイト分確保して〜という文章が出てくる。そのたびにちょっと考えて進数変換しているので、覚えて感覚でやるようにする。

1バイト。

  • (2進数) 8桁で1バイト 1000 1110
  • (16進数) 2桁で1バイト 8E
  • ASCIIコードでは1バイトで1文字を表す
    • 「A」 → 41 , 「1」 → 31

2バイト。

  • (2進数) 1001 0000 1000 1110
  • (16進数) 908E

3バイト。

  • (2進数) 1110 0110 1000 0100 1001 1011
  • (16進数) E6849B
  • UTF-8エンコードは1〜4バイトの可変長コードである。多くの日本語は3バイトで表現される
    • 「あ」 → E3 81 82 , 「愛」 → E6849B
  • RGBカラーコードは、各色1バイトの合計3バイトで表現する

KDOC 210: 『0と1のコンピュータ世界 バイナリで遊ぼう!』では、目安となる値を示している。

16進数表記 サイズ 覚え方
0x0100 256バイト char型の範囲
0x1000 4KB 仮想メモリのページサイズ
0x10000 64KB 16ビットで64KB
0x100000 1MB フロッピーディスク1枚分
0x10000000 256MB 4GBの4分の1のさらに4分の1
0xFFFFFFFF 4GB 整数の最大サイズ

確認方法

確かめてみると手っ取り早い。

echo -n "愛" | hexdump -C
00000000  e6 84 9b                                          |...|
00000003
echo -n "ABCD" | xxd
00000000: 4142 4344                                ABCD
def conv(target16)
  puts("_____________________")
  target10 = target16.to_i(16)
  printf("16進数: #{target16}\n")
  printf("10進数: %s\n", target10)
  printf(" 8進数: %s\n", target10.to_s(8))
  printf(" 2進数: %s\n", target10.to_s(2))
  printf("サイズ: %s bit\n", target10 * 8)
  printf("サイズ: %s byte\n", target10)
  printf("サイズ: %s KB\n", target10 / 1024.0)
  printf("サイズ: %s MB\n", target10 / 1024.0 / 1024.0)
  printf("サイズ: %s GB\n", target10 / 1024.0 / 1024.0 / 1024.0)
end
conv('100')
conv('1000')
conv('10000')
conv('100000')
conv('1000000')
conv('10000000')
conv('FFFFFFFF')
_____________________
16進数: 100
10進数: 256
 8進数: 400
 2進数: 100000000
サイズ: 2048 bit
サイズ: 256 byte
サイズ: 0.25 KB
サイズ: 0.000244140625 MB
サイズ: 2.384185791015625e-07 GB
_____________________
16進数: 1000
10進数: 4096
 8進数: 10000
 2進数: 1000000000000
サイズ: 32768 bit
サイズ: 4096 byte
サイズ: 4.0 KB
サイズ: 0.00390625 MB
サイズ: 3.814697265625e-06 GB
_____________________
16進数: 10000
10進数: 65536
 8進数: 200000
 2進数: 10000000000000000
サイズ: 524288 bit
サイズ: 65536 byte
サイズ: 64.0 KB
サイズ: 0.0625 MB
サイズ: 6.103515625e-05 GB
_____________________
16進数: 100000
10進数: 1048576
 8進数: 4000000
 2進数: 100000000000000000000
サイズ: 8388608 bit
サイズ: 1048576 byte
サイズ: 1024.0 KB
サイズ: 1.0 MB
サイズ: 0.0009765625 GB
_____________________
16進数: 1000000
10進数: 16777216
 8進数: 100000000
 2進数: 1000000000000000000000000
サイズ: 134217728 bit
サイズ: 16777216 byte
サイズ: 16384.0 KB
サイズ: 16.0 MB
サイズ: 0.015625 GB
_____________________
16進数: 10000000
10進数: 268435456
 8進数: 2000000000
 2進数: 10000000000000000000000000000
サイズ: 2147483648 bit
サイズ: 268435456 byte
サイズ: 262144.0 KB
サイズ: 256.0 MB
サイズ: 0.25 GB
_____________________
16進数: FFFFFFFF
10進数: 4294967295
 8進数: 37777777777
 2進数: 11111111111111111111111111111111
サイズ: 34359738360 bit
サイズ: 4294967295 byte
サイズ: 4194303.9990234375 KB
サイズ: 4095.9999990463257 MB
サイズ: 3.9999999990686774 GB

関連