肩ならしと前提条件

16進 0 1 2 3 4 5 6 7 8 9 a b c d e f
2進 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111

以下の記述において「*」は、厳密な意味での「don't care」ではなくて、たとえば「すべて0の並び以外の何か」とか「中略」のようなちょっと緩い感じで、プレースホルダ的に使っています。

あと、各ビットの実際のメモリ上の位置はエンディアンに依存するんですよね。ってわけで、C/C++で共用体 (union) を使って浮動小数点数のビット表現を印字しようとしても、場合分けが面倒だ。むむむ。いや、別にコード自体は探せばどこかにあると思うけれど、自分で書こうとすると面倒だな、ということですが。
$ echo -n 123456789 | od -tx1a
とか
$ echo -n 123456789 | hexdump -x
とかで、自分の環境は調べられるようではあるんだが……。xxd というのもある。けど、あまりこれ以上追究しても自分の興味の範囲からは外れるので、ここらでやめまする。

以下では、エンディアンに依存する物理的なバイト配置にしたがった実装依存のビット位置、ではなく、論理的な桁としてのビット位置を、-----という横線の直下にこの色で書いておきます (スペースの都合上、2段で表示しています)。 -----という横線の上側は、実装依存になりそうな部分であり、「こうなのかなぁ?」という程度のいい加減な想像を書いてあるだけです。信用しちゃダメですよ。

単精度浮動小数点数

 byte No. 2222 2222 3333 3333 0000 0000 1111 1111   ← この辺がエンディアンに依存するはずだが、きちんとは追究していない
 byte No. 3333 3333 2222 2222 1111 1111 0000 0000   ← リトルエンディアンだとこうなると思う
 byte No. 1111 1111 0000 0000 3333 3333 2222 2222   ← 
 byte No. 0000 0000 1111 1111 2222 2222 3333 3333   ← ビッグエンディアンだとこうなると思う
  bit No. 7654 3210 7654 3210 7654 3210 7654 3210
--------------------------------------------------------------
          3322 2222 2222 1111 1111 1100 0000 0000
   hex    1098 7654 3210 9876 5432 1098 7654 3210    説明 
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 符号が+、指数部が0x00、仮数部がすべて0。よって0を表す。

0000 0001 0000 0000 0000 0000 0000 0000 0000 0001 符号が+、指数部が0x00、非正規化数。2-126×(0.00 ... 01)2 = 2-126×2-23 = 2-149 [正の最小値]
00** **** 0000 0000 0*** **** **** **** **** **** 符号が+、指数部が0x00、非正規化数。2-126×(0.b22 ... b0)2 [この辺は2-149刻みになる]
007f ffff 0000 0000 0111 1111 1111 1111 1111 1111 符号が+、指数部が0x00、非正規化数。2-126×(0.11 ... 11)2

0080 0000 0000 0000 1000 0000 0000 0000 0000 0000 符号が+、指数部が0x01、正規化数。1-127= -126だから、2-126×(1.00 ... 00)2 = 2-126 [正の正規化数の最小値]
0080 0001 0000 0000 1000 0000 0000 0000 0000 0001 符号が+、指数部が0x01、正規化数。1-127= -126だから、2-126×(1.00 ... 01)2
00** **** 0000 0000 1*** **** **** **** **** **** 符号が+、指数部が0x01、正規化数。1-127= -126だから、2-126×(1.b22 ... b0)2 [この辺も2-149刻みになる]
00ff ffff 0000 0000 1111 1111 1111 1111 1111 1111 符号が+、指数部が0x01、正規化数。1-127= -126だから、2-126×(1.11 ... 11)2

0100 0000 0000 0001 0000 0000 0000 0000 0000 0000 符号が+、指数部が0x02、正規化数。2-127= -125だから、2-125×(1.00 ... 00)2
0100 0001 0000 0001 0000 0000 0000 0000 0000 0001 符号が+、指数部が0x02、正規化数。2-127= -125だから、2-125×(1.00 ... 01)2
01** **** 0000 0001 0*** **** **** **** **** **** 符号が+、指数部が0x02、正規化数。2-127= -125だから、2-125×(1.b22 ... b0)2 [この辺は2-148刻みになる]
017f ffff 0000 0001 0111 1111 1111 1111 1111 1111 符号が+、指数部が0x02、正規化数。2-127= -125だから、2-125×(1.11 ... 11)2

01** **** 0000 0001 1*** **** **** **** **** **** 符号が+、指数部が0x03、正規化数。3-127= -124だから、2-124×(1.b22 ... b0)2 [この辺は2-147刻みになる]
                            :
                            :
3f** **** 0011 1111 1*** **** **** **** **** **** 符号が+、指数部が0x7f (=127)、正規化数。127-127=0だから、20×(1.b22 ... b0)2 [この辺は2-23刻みになる]
40** **** 0100 0000 0*** **** **** **** **** **** 符号が+、指数部が0x80 (=128)、正規化数。128-127=1だから、21×(1.b22 ... b0)2 [この辺は2-22刻みになる]
                            :
                            :
4b** **** 0100 1011 0*** **** **** **** **** **** 符号が+、指数部が0x96 (=150)、正規化数。150-127=23だから、223×(1.b22 ... b0)2 [この辺は20刻みになる。つまりぴったり整数になる]
                            :
                            :
7f** **** 0111 1111 0*** **** **** **** **** **** 符号が+、指数部が0xfe (=254)、正規化数。254-127=127だから、2127×(1.b22 ... b0)2 [この辺は2104刻みになる]
7f7f ffff 0111 1111 0111 1111 1111 1111 1111 1111 符号が+、指数部が0xfe (=254)、正規化数。254-127=127だから、2127×(1.11 ... 11)2 [正の最大値]

7f80 0000 0111 1111 1000 0000 0000 0000 0000 0000 符号が+、指数部が0xff、仮数部がすべて0。よって+∞を表す。
7f** **** 0111 1111 1*** **** **** **** **** **** 符号が+、指数部が0xff、仮数部は、「すべて0」以外のもの。NaNを表す。

8000 0000 1000 0000 0000 0000 0000 0000 0000 0000 符号が-、指数部が0x00、仮数部がすべて0。よって-0を表す。
80** **** 1000 0000 0*** **** **** **** **** **** 符号が-、指数部が0x00、非正規化数。-2-126×(0.b22 ... b0)2 [この辺は2-149刻みになる]
8080 0000 1000 0000 1000 0000 0000 0000 0000 0000 符号が-、指数部が0x01、正規化数。-2-126×(1.00 ... 00)2 = -2-126 [負の正規化数で絶対値が最小の値]
                            :
                            :
bf** **** 1011 1111 1*** **** **** **** **** **** 符号が-、指数部が0x7f (=127)、正規化数。-20×(1.b22 ... b0)2 [この辺は2-23刻みになる]
c0** **** 1100 0000 0*** **** **** **** **** **** 符号が-、指数部が0x80 (=128)、正規化数。-21×(1.b22 ... b0)2 [この辺は2-22刻みになる]
                            :
                            :
ff7f ffff 1111 1111 0111 1111 1111 1111 1111 1111 符号が1、指数部が0xfe (=254)、正規化数。-2127×(1.11 ... 11)2 [負で絶対値が最大の値]

ff80 0000 1111 1111 1000 0000 0000 0000 0000 0000 符号が-、指数部が0xff、仮数部がすべて0。よって-∞を表す。
ff** **** 1111 1111 1*** **** **** **** **** **** 符号が-、指数部が0xff、仮数部は、「すべて0」以外のもの。NaNを表す。

倍精度浮動小数点数

           byte No. 6666 6666 7777 7777 4444 4444 5555 5555 2222 2222 3333 3333 0000 0000 1111 1111   ← この辺がエンディアンに依存するはずだが、きちんとは追究していない
           byte No. 1111 1111 0000 0000 3333 3333 2222 2222 5555 5555 4444 4444 7777 7777 6666 6666   ←
           byte No. 7777 7777 6666 6666 5555 5555 4444 4444 3333 3333 2222 2222 1111 1111 0000 0000   ← リトルエンディアンだとこうなると思う
           byte No. 0000 0000 1111 1111 2222 2222 3333 3333 4444 4444 5555 5555 6666 6666 7777 7777   ← ビッグエンディアンだとこうなると思う
            bit No. 7654 3210 7654 3210 7654 3210 7654 3210 7654 3210 7654 3210 7654 3210 7654 3210
----------------------------------------------------------------------------------------------------------------------------
                    6666 5555 5555 5544 4444 4444 3333 3333 3322 2222 2222 1111 1111 1100 0000 0000
    hexadecimal     3210 9876 5432 1098 7654 3210 9876 5432 1098 7654 3210 9876 5432 1098 7654 3210    説明
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 符号が+、指数部が0x000、仮数部がすべて0。よって0を表す。
0000 0000 0000 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001 符号が+、指数部が0x000、非正規化数。2-1022×(0.00 ... 01)2 = 2-1022×2-52 = 2-1074 [正の最小値]
000* **** **** **** 0000 0000 0000 **** **** **** **** **** **** **** **** **** **** **** **** **** 符号が+、指数部が0x000、非正規化数。2-1022×(0.b51 ... b0)2 [この辺は2-1074刻みになる]
000f ffff ffff ffff 0000 0000 0000 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 符号が+、指数部が0x000、非正規化数。2-1022×(0.11 ... 11)2

0010 0000 0000 0000 0000 0000 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 符号が+、指数部が0x001、正規化数。1-1023= -1022だから、2-1022×(1.00 ... 00)2 = 2-1022 [正の正規化数の最小値]
0010 0000 0000 0001 0000 0000 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001 符号が+、指数部が0x001、正規化数。1-1023= -1022だから、2-1022×(1.00 ... 01)2
001* **** **** **** 0000 0000 0001 **** **** **** **** **** **** **** **** **** **** **** **** **** 符号が+、指数部が0x001、正規化数。1-1023= -1022だから、2-1022×(1.b51 ... b0)2 [この辺も2-1074刻みになる]
001f ffff ffff ffff 0000 0000 0001 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 符号が+、指数部が0x001、正規化数。1-1023= -1022だから、2-1022×(1.11 ... 11)2

002* **** **** **** 0000 0000 0010 **** **** **** **** **** **** **** **** **** **** **** **** **** 符号が+、指数部が0x002、正規化数。2-1023= -1021だから、2-1021×(1.b51 ... b0)2 [この辺は2-1073刻みになる]
                                           :
                                           :
3ff* **** **** **** 0011 1111 1111 **** **** **** **** **** **** **** **** **** **** **** **** **** 符号が+、指数部が0x3ff (=1023)、正規化数。1023-1023=0だから、20×(1.b51 ... b0)2 [この辺は2-52刻みになる]
400* **** **** **** 0100 0000 0000 **** **** **** **** **** **** **** **** **** **** **** **** **** 符号が+、指数部が0x400 (=1024)、正規化数。1024-1023=1だから、21×(1.b51 ... b0)2 [この辺は2-51刻みになる]
                                           :
                                           :
433* **** **** **** 0100 0011 0011 **** **** **** **** **** **** **** **** **** **** **** **** **** 符号が+、指数部が0x433 (=1075)、正規化数。1075-1023=52だから、252×(1.b51 ... b0)2 [この辺は20刻みになる。つまりぴったり整数になる]
                                           :
                                           :
7fe* **** **** **** 0111 1111 1110 **** **** **** **** **** **** **** **** **** **** **** **** **** 符号が+、指数部が0x7fe (=2046)、正規化数。2046-1023=1023だから、21023×(1.b51 ... b0)2 [この辺は2971刻みになる]
7fef ffff ffff ffff 0111 1111 1110 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 符号が+、指数部が0x7fe (=2046)、正規化数。2046-1023=1023だから、21023×(1.11 ... 11)2 [正の最大値]

7ff0 0000 0000 0000 0111 1111 1111 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 符号が+、指数部が0x7ff、仮数部がすべて0。よって+∞を表す。
7ff0 **** **** **** 0111 1111 1111 **** **** **** **** **** **** **** **** **** **** **** **** **** 符号が+、指数部が0x7ff、仮数部は、「すべて0」以外のもの。NaNを表す。

8000 0000 0000 0000 1000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 符号が-、指数部が0x000、仮数部がすべて0。よって-0を表す。
800* **** **** **** 1000 0000 0000 **** **** **** **** **** **** **** **** **** **** **** **** **** 符号が-、指数部が0x000、非正規化数。-2-1022×(0.b51 ... b0)2 [この辺は2-1074刻みになる]
8010 0000 0000 0000 1000 0000 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 符号が-、指数部が0x001、正規化数。1-1023= -1022だから、-2-1022×(1.00 ... 00)2 = -2-1022 [負の正規化数で絶対値が最小の値]
                                           :
                                           :
bff* **** **** **** 1011 1111 1111 **** **** **** **** **** **** **** **** **** **** **** **** **** 符号が-、指数部が0x3ff (=1023)、正規化数。1023-1023=0だから、-20×(1.b51 ... b0)2 [この辺は2-52刻みになる]
c00* **** **** **** 1100 0000 0000 **** **** **** **** **** **** **** **** **** **** **** **** **** 符号が+、指数部が0x400 (=1024)、正規化数。1024-1023=1だから、-21×(1.b51 ... b0)2 [この辺は2-51刻みになる]
                                           :
                                           :
ffe* **** **** **** 1111 1111 1110 **** **** **** **** **** **** **** **** **** **** **** **** **** 符号が-、指数部が0x7fe (=2046)、正規化数。2046-1023=1023だから、-21023×(1.b51 ... b0)2 [この辺は2971刻みになる]
ffef ffff ffff ffff 1111 1111 1110 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 符号が-、指数部が0x7fe (=2046)、正規化数。2046-1023=1023だから、-21023×(1.11 ... 11)2 [負で絶対値が最大の値]

fff0 0000 0000 0000 1111 1111 1111 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 符号が-、指数部が0x7ff、仮数部がすべて0。よって-∞を表す。
fff* **** **** **** 1111 1111 1111 **** **** **** **** **** **** **** **** **** **** **** **** **** 符号が-、指数部が0x7ff、仮数部は、「すべて0」以外のもの。NaNを表す。