16進数の4桁の値を10進数に変換する必要があるため、ssscanfを使用しましたが、負の数では機能しません...たとえば、
int test;
sscanf("0xfff6","%x",&test);
-10ではなく65526を返します。どうすればそれを解決できますか?
4 に答える
手動で行う必要があります。x
変換指定子はからの変換を実行し、へunsigned int
のポインタ型の引数が必要unsigned int
です。たとえば、キャストの場合:
unsigned int test;
int result;
sscanf("0xfff6","%x", &test);
result = (int16_t) test;
test
の値が32kより大きいという事実は、それが「長い」整数(32ビット)であることを示しています...したがって、符号ビットは表示されません。負の値を確認するには、値をunsigned short integerに読み取り、それをsignedshortに型キャストする必要があります...
中心的な問題は、intが16ビットであると想定しているのに対し、システムではそれよりも大きいように見えることだと思います。
Intは常に署名されているため、65525として結果を報告しているという事実は、INT_MAXが36727の16ビット値より大きいことを証明しています。
コードをintテキストからshorttestに変更してみてください。うまくいくと思います。
これはおそらく、整数が16ビット幅を超えているため、実際に正であるためです。負の数を適切に表すには、さらに幅fff6
が必要な場合があります。fffffff6
これを修正するには、scanf
:の後に次のように配置します。
if (val > 32767) val -= 65536;
これにより、(16ビットで)最上位ビットが負になるように値が調整されます。