なりますときに私は、既存のコードを行っていたとunsigned int型の変数が負
unsigned int utc_time;
として宣言されたUTC時刻をデバッグするとき、私はいくつかの正の整数で、私は次のようになりそれによってたびに得ることができます私は時間がかかることを確認してください。しかし、突然コードでは、符号なし整数として宣言されている変数に対して負の値を得ました。
どうか私が理由を理解するのを助けてください。
なりますときに私は、既存のコードを行っていたとunsigned int型の変数が負
unsigned int utc_time;
として宣言されたUTC時刻をデバッグするとき、私はいくつかの正の整数で、私は次のようになりそれによってたびに得ることができます私は時間がかかることを確認してください。しかし、突然コードでは、符号なし整数として宣言されている変数に対して負の値を得ました。
どうか私が理由を理解するのを助けてください。
符号なし整数は、その性質上、ではありません。は負である可能性があります。
あなたは符号付き整数にキャストした場合、負の値になってしまう、あるいは単に符号付き整数に値を割り当てる、または署名としても、誤っなどのように、それを扱うことがあります。
#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ビット整数システムに出力します。
例えば、(署名された)int引数を必要とする ''%d "'形式の 'printf'を使用して印刷するなど、署名したかのように扱います。 –
@KeithThompsonこれは例で示したものではありませんか? –
@HunterMcMillen:この例は、Keithがコメントをしたように編集されました。良いタイミングです。 – AusCBloke
キャストまたはsigned
タイプとして扱われるとき。 unsigned int
をint
として印刷し、unsigned
のビットシーケンスは、負のsigned
の値に対応しています。
ie。おそらく、あなたはやった:%d
はunsigned
のために使用されている%u
に比べ、signed
整数です
unsigned int utc_time;
...
printf("%d", utc_time);
を。とにかく私達にコードを見せたら、あなたに確実に伝えることができます。
unsigned
変数には正または負の概念はありません。
ほとんどの(すべて?)Cプログラムの負の数は、符号なしの数字に1を加えたtwo's complementで表されます。あなたのデバッガや値をリストしたプログラムは、それが2の補数であることがわかるように、それを符号なし型として表示しない可能性があります。
確かにほとんどですが、すべてではありません:-) – paxdiablo
あなたがそれに署名したとして%i
として、あるいは%d
がvaribleが表示されますunsigned int型としてvaribleを表示%u
コメントに応えて
を表示する
printf("%u", utc_time);
を使用していることを確認してくださいint。
0pts - %uが何をするのか、upvoteに必要な理由の説明を追加してください。 –
フィードバックありがとうございます。 – mikek3332002
コードをどのようにデバッグしていますか? printf? –
問題のコードを表示できますか? – AusCBloke