らりばどと申します。
奇妙と思われる現象に出くわしました。
何らか解決の糸口を探しています。
助けて下さい。
別記事として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適用は何度やっても結果は同じです。
すみません、サービスパックの版数を間違えていました。
SP2ではなくSP5です。
>奇妙と思われる現象に出くわしました。
見たところ,何も奇妙な点はありませんが。
>> 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;
}
>YuOさん
お騒がせしてすみません。
ヘルプを見間違えていました。
pow関数にて正常動作を確認しました。
ありがとうございます。
解決後ではありますが、
>VCのバージョン情報には表示がありません。
こんなフリーソフトもあります。
http://www.vector.co.jp/soft/win95/prog/se222455.html
ツイート | ![]() |