Unsigned intは負数を格納できますか?


今日は『Cプログラミング言語』を見て次のようなコードを書きました
 
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