論理演算 Edit

演算法則 Edit

知っていると、複雑なif文の条件式を簡潔に記述できることがある。
if節とelse節(またはelse if節)に同じようなコードを記述している場合は、再考すべし。

  1. 冪等律
    A || A  ==  A && A  ==  A
  2. 交換律
    A || B  ==  B || A
    A && B  ==  B && A
  3. 結合律
    (A || B) || C  ==  A || (B || C)
    (A && B) && C  ==  A && (B && C)
  4. 吸収律
    (A || B) && A  ==  A
    (A && B) || A  ==  A
  5. 分配律
    (A || B) && C  ==  (A && C) || (B && C)
    (A && B) || C  ==  (A || C) && (B || C)
  6. 補元律
    (A || !A)  ==  TRUE
    (A && !A)  ==  FALSE
  7. ド・モルガンの法則
    !(A && B)  ==  !A || !B
    !(A || B)  ==  !A && !B
  8. その他
    A || TRUE   ==  TRUE
    A && TRUE   ==  A
    A || FALSE  ==  A
    A && FALSE  ==  FALSE

真理値について Edit

ブーリアン型は一般的に TRUE(0以外) と FALSE(0) の整数値で表わされる。
ただし、実際にTRUEの値がいくつに定義されているかに注意する必要がある。

TRUEFALSE
C++10
VB-10

バイトオーダ(エンディアン) Edit

概要 Edit

リトルエンディアンによるデータの格納 Edit

文字コード Edit

構造体メンバのバウンダリ Edit

C++のクラス(class, struct)の場合は、仮想関数テーブルへのポインタ変数など自動的に含まれてしまうことがあるため、単純に定義したメンバだけでサイズの計算ができないので注意。
ここではC言語の構造体について述べる。

 
バウンダリ
直訳:境界
バイト境界のこと。通常、2の冪乗のバウンダリが用いられる。
アライメント
直訳:位置揃え
バウンダリに合わせて構造体メンバのメモリ配置を揃えること。
パディング
直訳:詰め物
アライメントを行うために、メンバとメンバの間に挿入される暗黙のデータのこと。
 

以下の構造体を例として、構造体のメンバ変数の相対位置とサイズを考える。

#pragma pack(4) // コンパイラのオプションとしてアライメントを 4 に設定した場合

struct A{
    char    a;
    short   b;
    long    c;
    double  d;
    char    e;
};
  1. メンバ変数のアライメントを決定する。
    下記のうちの小さい方が採用される。配列の場合は1つ分の要素について考えること。
    ・コンパイラのオプションで設定されたアライメント。
    ・そのメンバ変数のサイズ。
    項目サイズアライメント
    struct A
    char a11
    short b22
    long c44
    double d84
    char e11
  2. メンバ変数のためのパディングを挿入する。
    2番目のメンバ変数の相対位置が、その変数のアライメントの倍数になるように直前にパディングを挿入する。
    項目サイズアライメント
    struct A
    char a11
    パディング1-
    short b22
    long c44
    double d84
    char e11
  3. 構造体のためのパディングを挿入する。
    構造体自体のアライメントは、メンバ変数のアライメントのうちの最大値となる。
    構造体のサイズがアライメントの倍数になるように、末尾にパディングを挿入する。
    項目サイズアライメント
    struct A204
    char a11
    パディング1-
    short b22
    long c44
    double d84
    char e11
    パディング3-
 

これで、構造体のメンバ変数の相対位置とサイズが決定する。

浮動小数点数 Edit

IEEE 754 Edit

浮動小数点で一般的に利用されている表現方式。
小数を正規化(「1.xxx * 2^n」の形にすること)して符号、指数部、仮数部に分けて格納する。
代表的なのは、32ビット単精度(single/float)と64ビット倍精度(double)の2種類。

表現できる範囲 Edit

符号部/指数部/仮数部 Edit

浮動小数点への変換手順(単精度の例) Edit

  1. 符号、指数、仮数に分割していく。
    例:「-5.25」
  2. 値の正負によって符号を決定。
    例:- なので「1」
  3. 以降は変換対象の値を絶対値で考える。
    例:「5.25」
  4. 値を二進数で表現する。
    例:「5.25」→「101.01」
  5. 正規化を行う。
    例:「101.01」→「1.0101 * 2^2」
  6. 仮数を左詰めで格納し、足りない部分は 0 を埋める
    例:「0101」→「01010000000000000000000」
  7. 指数にバイアスを加え、二進数で表現する。
    例:「2+127=129」→「10000001」
  8. 各部に格納して完成。
    例:「1 10000001 01010000000000000000000」→「0xC0A80000」

正規化数以外の表現 Edit

∞など

float型からdouble型へのキャスト Edit

符号/指数部/仮数部それぞれ、変換して格納される。

関数(サブルーチン)コールの仕組み Edit

引数 Edit

全て32bitに拡張され、呼出規約に従ってスタックに積まれ、使用後にクリアされる。

戻り値 Edit

呼出規約(Calling Convention)の種類 Edit

名称説明引数の渡し方スタックのクリア関数名の修飾(マングル)
※元はfunc()とする
大文字/小文字の変換VC++でのキーワード
cdeclC/C++ プログラムのデフォルトの呼出規約。
可変引数リストを使用可能。
関数呼び出し毎にスタックのクリアコードが生成されるため、実行コードが大きくなる。
右から左にスタックに積まれる。呼び出し側_funcなし__cdecl
stdcallWin32API用の呼出規約。
Cで作ったDLLの関数をVBで呼ぶ場合はこれにする。
右から左にスタックに積まれる。呼び出された側_func@12
※末尾の数字は引数の合計バイト(10進)
なし__stdcall
fastcall高速にアクセスできるレジスタを使用した呼出規約。
実行時の効率重視。
最初の2つの32bit以下の引数はECX,EDXに入れて渡される。
それ以外は、右から左にスタックに積まれる。
呼び出された側@func@12
※末尾の数字は引数の合計バイト(10進)
なし__fastcall
thiscall
(可変引数リストなし)
クラスのメンバ関数用の呼出規約。
可変引数リストを使用可能。
可変引数リストを使用するか否かで規約内容が異なる。
thisポインタがECXに入れて渡される。それ以外はstdcallと同様。なし
thiscall
(可変引数リストあり)
引数を右から左にスタックに積んだ後、thisポインタも積む。それ以外はcdeclと同様。

ソート Edit

安定ソートと非安定ソート Edit

一致するデータが存在する場合のソート結果が定まっているものを安定ソート、未定義のものを非安定ソートと呼ぶ。
バブルソートは安定ソート、クイックソートは非安定ソートである。
非安定ソートであっても、比較処理を工夫することで安定化できる場合がある。(各データにユニークな値が必要)

比較処理の例


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS