重複の可能性:
署名された16進数をcで印刷する方法
16進数を印刷しようとしています。
私が出力しようとしている変数はタイプint i
であり、次の場合に:
printf("%06X", i);
数値が負の場合は常に8桁、正の場合は6桁になります。
"%06"
、を、"%04"
または他の何かに変更しても、値が負の場合は常に8桁になります。
重複の可能性:
署名された16進数をcで印刷する方法
16進数を印刷しようとしています。
私が出力しようとしている変数はタイプint i
であり、次の場合に:
printf("%06X", i);
数値が負の場合は常に8桁、正の場合は6桁になります。
"%06"
、を、"%04"
または他の何かに変更しても、値が負の場合は常に8桁になります。
「%06X」の「6」は、印刷する最小桁数を指定します。完全な値を表示するためにさらに必要な場合、変換はより多く印刷されます。「0」は、値が要求された最小桁数よりも小さい場合、デフォルトのスペースではなく、先行ゼロを使用することを示します。
「X」指定子はunsigned int
引数用であるため、8桁の数字が表示されます。unsigned int
負の値はありません。Cの実装では、負の値int
を符号なしとしてエンコードするビットを再解釈していますint
。たとえば、int
値-1は、32ビット2の補数形式で0xffffffffとして格納されます。したがって、フォーマット変換unsigned int
では、上位ビットが設定されたが認識され、それらを表示するために必要なすべての桁が使用されます。
実行できる、または実行する必要のある変更がいくつかあります。
int
まず、を期待する指定子にを渡さないでくださいunsigned int
。int
のように、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
オーバーフローする可能性がある場合は、簡単な変更を行って、目的の動作を得ることができます。)
負の数は、2の補数を使用して2進数で表されて格納されます。これは、2進数の負の数には、先頭に1が付いていることを意味します。この計算機をいじって、より良い感触を得てください。
printf
数値を使用して数値をフォーマットするように要求した場合%X
、その数値は符号なしとして扱われます。私が負の数である可能性を無視して負の数の2進表現を扱う場合、つまり、先頭の1を負の数であるという兆候として無視する場合、実際にはその数が大きいと評価することしかできません。
この06
部分はprintf
、数字の先頭に0を付けて6桁まで埋めるように指示します。もちろん、番号がすでに6桁を超えている場合、これは関係ありません。