2009-12-02 8 views
5

私は符号なし整数を持っていますが、%dを使用して印刷するときに、そこに負の値があることがありますか?C符号なし整数が負の値を指定していますか?

+1

コンパイラでこの種のエラーについて警告するオプションがあるかどうかを確認してください。それはgccを使ってフォーマットします。 –

+0

[符号なし整数の最大値を出力する方法は?](http://stackoverflow.com/questions/12812812/how-can-i-print-maximum-value-of-an-unsigned-integer) –

答えて

10

これは動作するはずです:

unsigned int a; 
printf("%u\n", a); 

説明:ほとんどのアーキテクチャでは、整数はtwo's complementで表現されて署名しました。このシステムでは、intまたはunsigned intのいずれを使用しているかにかかわらず、2**(N-1)(ここではN = sizeof(int))より小さい正の数値が同じ方法で表されます。ただし、符号なし整数の数値が2**(N-1)より大きい場合は、負の符号付き数値が2の補数で表されます。これはを渡したときのprintfの値です。

26

印刷%dは、定義された型にかかわらず、整数を符号付き10進数として読み取ります。

符号なし数値を出力するには、%uを使用します。

これは、Cが可変引数を処理するために発生します。コンパイラは、スタックから値を取り出し(void*と呼び出しスタックを指す)、printfは、与えられた書式文字列に含まれるデータを把握する必要があります。

toStringから汎用または事前定義されたフォーマット文字列を提供する必要があります.CはRTTIの方法ではありません。たとえば、Javaの場合はObjectとなります。

+4

Nitpick:Cは値によって呼び出されるため、コンパイラはポインタではなく引数の値を取得します。あなたは値(printf( "%u"、myvariable);)へのポインタを渡さず、値を直接渡します(printf( "%u"、myvariable);)。 – unwind

+1

実際には 'printf'にスタックへのポインタを与えます。 – LiraNuna

+0

@LiraNuna - varargs関数の実装が指定されていないので、 '#define va_copy(dest、src)dest = src'や' #define va_copy(dest、src)memcpy(dest、src、sizeof(va_list )) 'は、提供されていないシステム上の' va_copy'マクロの移植可能な置き換えです。そのうちの1人は働くかもしれませんが、誰がどちらを知っていますか? –

4

%dは、printfが値をint(符号付き)として解釈することを意味します。 unsigned intの場合、%uを使用してください。

関連する問題