ぼんさい塾

ぼんさいノートと補遺に関する素材や注釈です.ミスが多いので初稿から1週間を経た重要な修正のみ最終更新日を残しています.

データの型

2013-08-19 19:47:51 | 暮らし
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」が表示されます(大域変数は無指定なら静的 --- これも自然).