0

16進数の4桁の値を10進数に変換する必要があるため、ssscanfを使用しましたが、負の数では機能しません...たとえば、 int test; sscanf("0xfff6","%x",&test); -10ではなく65526を返します。どうすればそれを解決できますか?

4

4 に答える 4

3

手動で行う必要があります。x変換指定子はからの変換を実行し、へunsigned intのポインタ型の引数が必要unsigned intです。たとえば、キャストの場合:

unsigned int test;
int result;

sscanf("0xfff6","%x", &test);
result = (int16_t) test;
于 2013-02-10T21:53:52.073 に答える
0

testの値が32kより大きいという事実は、それが「長い」整数(32ビット)であることを示しています...したがって、符号ビットは表示されません。負の値を確認するには、値をunsigned short integerに読み取り、それをsignedshortに型キャストする必要があります...

于 2013-02-10T21:54:15.570 に答える
0

中心的な問題は、intが16ビットであると想定しているのに対し、システムではそれよりも大きいように見えることだと思います。

Intは常に署名されているため、65525として結果を報告しているという事実は、INT_MAXが36727の16ビット値より大きいことを証明しています。

コードをintテキストからshorttestに変更してみてください。うまくいくと思います。

于 2013-02-10T21:55:42.000 に答える
0

これはおそらく、整数が16ビット幅を超えているため、実際に正であるためです。負の数を適切に表すには、さらに幅fff6が必要な場合があります。fffffff6

これを修正するには、scanf:の後に次のように配置します。

if (val > 32767) val -= 65536;

これにより、(16ビットで)最上位ビットが負になるように値が調整されます。

于 2013-02-10T21:57:08.770 に答える