progC.pdf progC-s.pdf 記事一覧 |
![]() IEEE 754 |
progC-s.pdf に「D8J%データの型」を追加しました.
参考資料([n]は本文でも引用):
[1] データ型 - Wikipedia
http://ja.wikipedia.org/wiki/%E3%83%87%E3%83%BC%E3%82%BF%E5%9E%8B
詳細は「プリミティブ型」および「複合データ型」を参照; 詳細は「型システム」を参照
[2] (再掲) 整数型 - Wikipedia
http://ja.wikipedia.org/wiki/%E6%95%B4%E6%95%B0%E5%9E%8B
[3] データ型 (C# と Java の比較) - MSDN - Microsoft
http://msdn.microsoft.com/ja-jp/library/ms228360(v=vs.90).aspx
.NET Framework データ型間の暗黙の型変換の一覧を次に示します。
[4] IEEE 754 - ウィキペディア - Wikipedia
http://ja.wikipedia.org/wiki/IEEE_754
・これを単に2の補数で表すと、全体の符号 sign とは別に exponent も符号を持つことになり、単純な大小比較ができなくなってしまう。そのため、指数部はバイアスされて常に正の値となるような・・・
・非正規化数の場合q = -126で、cが 0.fraction とする。(qは-127 ではない。仮数の小数点以上の部分が0になっている関係で、指数を-126としてバランスをとっている。)
[5] 型変換 - Wikipedia
http://ja.wikipedia.org/wiki/%E5%9E%8B%E5%A4%89%E6%8F%9B
[6] Cの型変換と式 - @IT
http://www.atmarkit.co.jp/fcoding/articles/c/05/c05a.html
補遺:(1) 指数部のバイアス表現の意図については[4]を見てください.
(2) 配列については progC-e.pdf(演習)で詳しく調べます.BccDev.exe で
int x[4] = {10, 11, 12, 13};
printf("%d, %d, %d, %d\n", x+1, (&x[0])+1, x+2, (x+2)-(x+1));
を実行したときの出力は「1245056, 1245056, 1245060, 1」でした.(x+x), (2*x)は「無効なポインタの加算」「ポインタの不正な使用」になりました.
(3) ポインタについては別途説明しますが,1ページに纏めるので http://pulsar.blog.ocn.ne.jp/topics/B2010-03.pdf より詳しくなることはありません.
(4) キャストの代わりに所望の変数に代入したときの処理を
int x0, x1, x2; double y = 0x123456789;
char c0; unsigned char c1; float z;
x0 = y; x1 = y * 16; x2 = y * 256; c0 = c1 = y; z = y*1000;
printf("x0=%x, x1=%x, x2=%x, y=%f\n", x0, x1, x2, y);
printf("c0=%x, c1=%x, z=%f\n", c0, c1, z);
で調べた結果は次のようになりました.
x0=23456789, x1=34567890, x2=45678900, y=4886718345.000000
c0=ffffff89, c1=89, z=4886718578688.000000 (整数は整数)
(5) 静的変数は指定がなければ 0 や NULL になるが自動変数では何故そうとは言えないのかは,プログラムがどのようにコンパイルされるかを知れば極めて自然であることが分かります --- スタック・記憶クラスの話で言及します.
※ main( ) の外で「int *p;」と宣言して「printf("%d\n", p);」を実行すると「0」が表示されます(大域変数は無指定なら静的 --- これも自然).