目次
1. 演算中の型昇格(同じ型の計算で発生)
1) まず、コードを見てみましょう
unsigned char c=256;
printf("%d",c);
実行結果: 0;
どうしてこれなの?それを分析しましょう。unsigned char の値の範囲は [0, 255] です。バイナリ表現は 11111111 で、すべてのメモリを占有します。256 のバイナリ表現は 10000000 です。11111111 10000000 を比較してみましょう。ここで切り捨てが発生します。つまり、最終的には 00000000 のみが保持され、実行結果はすべて 0 になります。
2) もう一度コードを見てみましょう
unsigned char c=-1;
printf("%d",c);
実行結果: 255;
分析します:
-1 源码:10000001
反码:11111110
补码:11111111 //在无符号char类型下它的结果就是255
3) もう一度コードを見てみましょう
char a = 5;// 00000000000000000000000000000111(运行时会进行整形提升)
char b = 127;// 00000000000000000000000001111111
char c = a + b;//00000000000000000000000010000110 先截断10000110(符号位是1,是负数,转化为源码=-124)
printf("%d", c);
走行結果:-124
実際にfloatで計算するとdoubleに変換されて計算されるので、実際に試してみてください。
2. さまざまな種類の計算
ルール:
char、short、int はすべて整数ファミリーです
char および int 操作を int 操作に変換する
int および float 演算を double 演算に変換する
double および int 演算は double 演算に変換されます。
1) コードの一部を見て結果を推測する
int a=2;
printf("%f",a/3);
実行結果: 0.000000
誰でも簡単に結果が得られますか? a と 3 は両方とも整数なので、小数点以下の値は計算されず、最終的な結果は 0 になります。
2) コードを見て結果を推測する
float b=2;
printf("%f",b/3);
実行結果: 0.666667
float と int を演算すると、int は強制的に float になるため、小数点が演算され、最終結果は 0.666667 になるため、推測できるはずです。
「たかが豆知識、なんて難しいことだろう」と思われるかもしれませんが、これが当てはまるほど間違いを犯しやすくなります。私は、知識ポイントを習得するのが難しいものではなく、普段無視している詳細な知識を理解していました。それらの間違いは、しばしば私を混乱させ、とらえどころがなく、問題を解く際に、コンピューターのせいなのか、それとも自分自身の混乱のせいなのかと常に考えていました。したがって、私たちはそれらの細部や小さなことにもっと注意を払う必要があります。