はてなキーワード: endianとは
𩸽(ほっけ)のUnicode符号位置はU+29E3D。これをUTF-16で表すとする。
U+10000以上の符号位置の文字をUTF-16で表す場合、サロゲートペアによって表現される。
まず、Unicode符号位置を表す「U+n」のnに対して、0x10000を減算する。
𩸽はU+29E3Dだから、0x10000を減算すると、nは0x19E3Dとなる。
(なお、Unicode符号位置が0x10000未満である場合は、それは16ビットであり(なぜなら0x10000未満であるとは、最大でも0xFFFFだから)、2バイトで表現される。これはBMPの範疇であり、サロゲートペア表現(BMP外の文字表現)の出番はない。)
(また、0x10000以下の符号位置のうち、Unicode符号位置U+D800~U+DFFFはサロゲートペア用に確保された符号位置領域であり、この領域内の一符号位置に対応する文字は無い。)
$ echo "obase=2; ibase=16; 19E3D" | bc 11001111000111101 ↓(不足した桁をゼロで埋める) 00011001111000111101
となる。
この20けた(0001100111 1000111101)のうち、
①上位10桁(0001100111)に対して0xD800(1101100000000000)を足す。これを上位サロゲートと呼ぶ。
1101100000000000 0001100111 ↓ 1101100001100111
②下位10桁(1000111101)に対して0xDC00(1101110000000000)を足す。これを下位サロゲートと呼ぶ。
1101110000000000 1000111101 ↓ 1101111000111101
③上位サロゲートと下位サロゲートの組み合わせ(1101100001100111 1101111000111101)が、UTF-16サロゲートペア表現そのものである。
$ echo "obase=16; ibase=2; 11011000011001111101111000111101" | bc D867DE3D
$ unicode 𩸽 UTF-16BE: d867de3d (※"BE"とはbig-endianの略であり、「この16進表現は左から上位バイトとして読みますよ」という意味)
Unicodeにおいて、本来、文字は16bit、つまり65535文字で十分表現できるはずだった。
しかし中国の古代漢字などの文字も収録しようとすると、とても16bit程度では表現できないことが分かった。
そこで、UTF-16という符号化方式においては、サロゲートペアという工夫を使うことで、10万以上の文字を扱えるように仕様を整えた。
正確にいうと、2byte(16bit)では65536文字が表現できる。
ところで、0xD800~0xDFFF(2048の符号位置)はサロゲートペア用に確保されているため、特定の文字の符号位置としては利用できない。
その一方、サロゲートペアによって20bit分(1048576文字分)の符号位置を確保できたため、UTF-16では、
$ echo $((65536-2048+1048576)) 1112064
https://en.wikipedia.org/wiki/X86_assembly_language#Execution_modes
Real mode (16-bit)
Protected mode (16-bit and 32-bit)
Long mode (64-bit)
Virtual 8086 mode (16-bit)
System Management Mode (16-bit)
https://software.intel.com/en-us/articles/introduction-to-x64-assembly
General Architecture
Since the 64-bit registers allow access for many sizes and locations, we define a byte as 8 bits, a word as 16 bits, a double word as 32 bits, a quadword as 64 bits, and a double quadword as 128 bits. Intel stores bytes "little endian," meaning lower significant bytes are stored in lower memory addresses.