2

重複の可能性:
署名された16進数をcで印刷する方法

16進数を印刷しようとしています。

私が出力しようとしている変数はタイプint iであり、次の場合に:

printf("%06X", i);

数値が負の場合は常に8桁、正の場合は6桁になります。

"%06"、を、"%04"または他の何かに変更しても、値が負の場合は常に8桁になります。

4

2 に答える 2

3

「%06X」の「6」は、印刷する最小桁数を指定します。完全な値を表示するためにさらに必要な場合、変換はより多く印刷されます。「0」は、値が要求された最小桁数よりも小さい場合、デフォルトのスペースではなく、先行ゼロを使用することを示します。

「X」指定子はunsigned int引数用であるため、8桁の数字が表示されます。unsigned int負の値はありません。Cの実装では、負の値intを符号なしとしてエンコードするビットを再解釈していますint。たとえば、int値-1は、32ビット2の補数形式で0xffffffffとして格納されます。したがって、フォーマット変換unsigned intでは、上位ビットが設定されたが認識され、それらを表示するために必要なすべての桁が使用されます。

実行できる、または実行する必要のある変更がいくつかあります。

intまず、を期待する指定子にを渡さないでくださいunsigned intintのように、unsigned intをキャスト付きのに変換する必要があり(unsigned int) iます。

次に、印刷する値を渡す必要があります。下位6桁の16進数のみを印刷する場合は、AND演算子を指定したマスクを使用して、これらの数字だけを渡すことができますprintf("%06X", (unsigned int) i & 0xffffff)

または、符号付き16進値を出力する場合は、次のように自分で符号を処理する必要があります。

if (0 <= i)
    printf(" %06X", (unsigned int)  i);
else
    printf("-%06X", (unsigned int) -i);

(後者は、オーバーフローiするほど大きな負の値になることはないと想定してい-iます。-iオーバーフローする可能性がある場合は、簡単な変更を行って、目的の動作を得ることができます。)

于 2012-12-30T13:33:53.763 に答える
0

負の数は、2の補数を使用して2進数で表されて格納されます。これは、2進数の負の数には、先頭に1が付いていることを意味します。この計算機をいじって、より良い感触を得てください。

printf数値を使用して数値をフォーマットするように要求した場合%X、その数値は符号なしとして扱われます。私が負の数である可能性を無視して負の数の2進表現を扱う場合、つまり、先頭の1を負の数であるという兆候として無視する場合、実際にはその数が大きいと評価することしかできません。

この06部分はprintf、数字の先頭に0を付けて6桁まで埋めるように指示します。もちろん、番号がすでに6桁を超えている場合、これは関係ありません。

于 2012-12-30T13:49:08.147 に答える