文字列を符号付き整数に変換したい。以下が要件です。16 進値を文字列としてバッファーに格納しました。今、その値をsigned intに変換したいと思います。
buf = "fb869e"
これを signed int に変換します。したがって、o/p は -293218 である必要があります。しかし、strtol を使用して変換しようとすると、16483998 が返されます。
16 進数0xfb869e
は負ではありません。組み込みの数値変換関数は、値が正であるため、負の値に変換しません。
あなたが言っているのは、これは24ビットの2の補数の負の数に相当する符号なしの16進数であり、その数が必要だということです。それを取得する方法は、それを正の数に変換してから、計算を使用して 24 ビットの 2 の補数に変換することです。
char *buf = "fb869e";
long n;
n = strtol(buf, NULL, 16);
if (n > 0x7fffffL)
n -= 0x1000000L;
他の人が提案していstrtol()
ます。sscanf()
代わりに言及したいだけです。例えば:
int i;
char *buf = "fb869e";
if (sscanf(buf, "%x", &i) == 1)
...
整数strtol
に変換string
するを使用します。long
0xfb869e == 0x00fb869e == 16483998
符号付き整数として、上位ビットを設定して負の数を生成する必要があります。指定された数値の上位ビットは設定されていないため、正でなければなりません。
数値を 24 ビット数値として扱いたい場合は、ビット 23 を残りの上位ビットにパディングする必要があります。これを行う1つの方法は次のとおりです。
long n = strtol(...);
if (n > 0xffffff) n |= 0xff000000;
strtol は文字列を長整数に変換します
出力は正しく、16483998 になります。
また、atoi を使用すると、文字列から整数への変換中に、表現可能な値の範囲外の場合は正しい値、INT_MAX または INT_MIN が返されます。
0x00fb869e を負の数にする必要があるのはなぜですか? ある形式の値が別の形式の負であるかどうかを判断できるようにするために、数値システムのベースを提供する必要があります