Unsigned intは負数を格納できますか?
1221 ワード
今日は『Cプログラミング言語』を見て次のようなコードを書きました
Console: -20
理論的にはaがunsigned intと宣言した後に正しい値を表示できるはずがないが、ここで-20を表示できるのはprintfのフォーマットパラメータに%dが使用されているため、この関数はまずaをintタイプに変換する.
コンパイラの境界処理を知っていれば、この場合一般的にaが示す値は4294967276(32ビットマシンではintは32ビットbitで表され、符号なしintが表す最大数は4294967296)であることがわかるはずです.
私が理解しているコンパイラの上記のコードに対する処理について説明します.
1.-20はintタイプであり、2行目の付与文は、unsigned intとintがメモリに格納されているビット数が同じであるため、物理メモリでは完全に同じであるため、unsigned intタイプに強制的に変換される.
2.3行目printfが%dプレースホルダに遭遇した場合、ここにintタイプの値を表示すべきだと判断し、aをintタイプに変換するので、このとき表示される結果は元の付与値と同じである
符号なし整数値を表示するには、%uプレースホルダを使用します.
転載先:https://www.cnblogs.com/junhzhan/archive/2013/01/29/2881330.html
int main(void) {
unsigned int a = -20;
printf("%d", a);
return EXIT_SUCCESS;
}
Console: -20
理論的にはaがunsigned intと宣言した後に正しい値を表示できるはずがないが、ここで-20を表示できるのはprintfのフォーマットパラメータに%dが使用されているため、この関数はまずaをintタイプに変換する.
コンパイラの境界処理を知っていれば、この場合一般的にaが示す値は4294967276(32ビットマシンではintは32ビットbitで表され、符号なしintが表す最大数は4294967296)であることがわかるはずです.
私が理解しているコンパイラの上記のコードに対する処理について説明します.
1.-20はintタイプであり、2行目の付与文は、unsigned intとintがメモリに格納されているビット数が同じであるため、物理メモリでは完全に同じであるため、unsigned intタイプに強制的に変換される.
2.3行目printfが%dプレースホルダに遭遇した場合、ここにintタイプの値を表示すべきだと判断し、aをintタイプに変換するので、このとき表示される結果は元の付与値と同じである
符号なし整数値を表示するには、%uプレースホルダを使用します.
転載先:https://www.cnblogs.com/junhzhan/archive/2013/01/29/2881330.html