「16の2乗」の結果が18になるのはなぜ?

解決


らりばど  2002-04-26 11:48:53  No: 50113  IP: [192.*.*.*]

らりばどと申します。
奇妙と思われる現象に出くわしました。
何らか解決の糸口を探しています。
助けて下さい。

別記事としてchar型変数に格納されている16進数を
int型に変換しようとした時のことです。
質問をあげている間に一時しのぎをしようとユーザ関数を作りました。
chra型変数の最後尾から、16の乗数を以って乗算していこうとする
ものです。

しかし計算が合わず原因を探していたところ、16の乗数を算出する
ことろで結果が思惑と違っていることに気付きました。

試しに、
> wk1 = 16 ^ 1;
> wk2 = 16 ^ 2;
と実行してみると、
wk1 = 17
wk2 = 18
という結果が返ってきます。

何らか修正パッチ等を適用する必要があるのでしょうか。

開発環境はVisualStudio6.0のCD-ROMからVBとVCを
インストールしました。またSP2も適用しています。
しかしVBのバージョン情報には「SP2」と表示されていますが、
VCのバージョン情報には表示がありません。
もしかして適用されていないのでしょうか。
SP適用は何度やっても結果は同じです。

編集 削除
らりばど  2002-04-26 11:54:36  No: 50114  IP: [192.*.*.*]

すみません、サービスパックの版数を間違えていました。
SP2ではなくSP5です。

編集 削除
YuO  2002-04-26 17:15:14  No: 50115  IP: [192.*.*.*]

>奇妙と思われる現象に出くわしました。

見たところ,何も奇妙な点はありませんが。


>> wk1 = 16 ^ 1;
>> wk2 = 16 ^ 2;
>と実行してみると、
>wk1 = 17
>wk2 = 18
>という結果が返ってきます。

当然です。
^はBitwise exclusive-ORを意味する演算子ですから。
ref) ISO/IEC 9899:1999 6.5.11 Bitwise exclusive-OR

累乗を計算するのには,math.hのpow関数を使います。
ref) ISO/IEC 9899:1999 7.12.7.4 The pow function

恐らく,VBのヘルプを見て勘違いしたのでしょう。
自分が見ているヘルプがVBのものかVC++のものかは区別した方がよいですよ。


でもって,変換関数の一例。
#デバッグを全くしていないので注意です。
/* xchar_to_int
    16進数字を数値に変換
*/
int xchar_to_int (char ch)
{
#if 1
    /* ASCIIを仮定 */
    if ('0' <= ch && ch <= '9') return ch - '0';
    if ('A' <= ch && ch <= 'F') return ch - 'A' + 10;
    if ('a' <= ch && ch <= 'f') return ch - 'a' + 10;
    return -1;
#else
    /* 汎用の場合 */
    switch (ch) {
    case    '0':
        return 0;
    case    '1':
        return 1;
    case    '2':
        return 2;
    case    '3':
        return 3;
    case    '4':
        return 4;
    case    '5':
        return 5;
    case    '6':
        return 6;
    case    '7':
        return 7;
    case    '8':
        return 8;
    case    '9':
        return 9;
    case    'A':
    case    'a':
        return 10;
    case    'B':
    case    'b':
        return 11;
    case    'C':
    case    'c':
        return 12;
    case    'D':
    case    'd':
        return 13;
    case    'E':
    case    'e':
        return 14;
    case    'F':
    case    'f':
        return 15;
    }
    return -1;
#endif
}

/* xstr_to_int
    16進数字列を数値に変換
*/
int xstr_to_int (const char * str)
{
    int r = 0, t;
    int sign = 1; /* 符号フラグ */

    if (str == 0) return 0; /* NULL チェック */
    if (*str == '-') { /* 負の場合 */
        sign = -1;
        ++str;
    }

    /* 変換処理 */
    while ((t = xchar_to_int(*str++)) != -1) {
        r <<= 4;
        r |= t;
    }

    return r * sign;
}

編集 削除
らりばど  2002-04-30 09:17:51  No: 50116  IP: [192.*.*.*]

>YuOさん

お騒がせしてすみません。
ヘルプを見間違えていました。
pow関数にて正常動作を確認しました。
ありがとうございます。

編集 削除
蛇足  2002-05-16 12:52:08  No: 50117  IP: [192.*.*.*]

解決後ではありますが、

>VCのバージョン情報には表示がありません。
こんなフリーソフトもあります。

http://www.vector.co.jp/soft/win95/prog/se222455.html

編集 削除