2011-12-06 10 views
3

なりますときに私は、既存のコードを行っていたとunsigned int型の変数が負

unsigned int utc_time;

として宣言されたUTC時刻をデバッグするとき、私はいくつかの正の整数で、私は次のようになりそれによってたびに得ることができます私は時間がかかることを確認してください。しかし、突然コードでは、符号なし整数として宣言されている変数に対して負の値を得ました。

どうか私が理由を理解するのを助けてください。

+1

コードをどのようにデバッグしていますか? printf? –

+0

問題のコードを表示できますか? – AusCBloke

答えて

9

符号なし整数は、その性質上、ではありません。は負である可能性があります。

あなたは符号付き整数にキャストした場合、負の値になってしまう、あるいは単に符号付き整数に値を割り当てる、または署名としても、誤っなどのように、それを扱うことがあります。

#include <stdio.h> 

int main (void) { 
    unsigned int u = 3333333333u; 
    printf ("unsigned = %u, signed = %d\n", u, u); 
    return 0; 
} 

unsigned = 3333333333, signed = -961633963 

を32ビット整数システムに出力します。

+0

例えば、(署名された)int引数を必要とする ''%d "'形式の 'printf'を使用して印刷するなど、署名したかのように扱います。 –

+0

@KeithThompsonこれは例で示したものではありませんか? –

+0

@HunterMcMillen:この例は、Keithがコメントをしたように編集されました。良いタイミングです。 – AusCBloke

3

キャストまたはsignedタイプとして扱われるとき。 unsigned intintとして印刷し、unsignedのビットシーケンスは、負のsignedの値に対応しています。

ie。おそらく、あなたはやった:%dunsignedのために使用されている%uに比べ、signed整数です

unsigned int utc_time; 
... 
printf("%d", utc_time); 

を。とにかく私達にコードを見せたら、あなたに確実に伝えることができます。

unsigned変数には正または負の概念はありません。

1

ほとんどの(すべて?)Cプログラムの負の数は、符号なしの数字に1を加えたtwo's complementで表されます。あなたのデバッガや値をリストしたプログラムは、それが2の補数であることがわかるように、それを符号なし型として表示しない可能性があります。

+0

確かにほとんどですが、すべてではありません:-) – paxdiablo

3

あなたがそれに署名したとして%iとして、あるいは%dがvaribleが表示されますunsigned int型としてvaribleを表示%uコメントに応えて


を表示する

printf("%u", utc_time); 

を使用していることを確認してくださいint。

+1

0pts - %uが何をするのか、upvoteに必要な理由の説明を追加してください。 –

+0

フィードバックありがとうございます。 – mikek3332002

関連する問題