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
- 「A」 →
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バイトで表現する
`FF FF FF(白)- カラーコード - Wikipedia
- ウェブカラー - Wikipedia
本『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
関連
抽象。
- よく出てくる量の目安を覚えて、毎回の換算を省く
関連。
- 具体例: KDOC 80: 「あ」がどうして343 201 202になるのか。3バイトの例に出てくる「あ」のUTF-8表現を、ビットまで分解して読んでいる
- 補足: KDOC 126: xxdでファイルをバイナリで見る。バイナリを確認する方法
- 補足: KDOC 144: データ型によるサイズの違いを確かめる。何バイトあるかで扱える値の範囲が決まることを確かめている