私はかなりの時間からcでプログラミングしています。しかし、整数ラップアラウンドが発生するプログラムでは決して働きませんでした。整数が4バイト割り当てられている場合、整数の範囲は-2,147,483,648から2,147,483,647になります。私たちが限界を超えれば、それはただラップアラウンドします。整数のラップアラウンドをCで
ラップアラウンドがどのように起こるかを調べるために、次のプログラムで作業していました。
#include <stdio.h>
int main() {
int n = 4, s = 2;
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < n; ++j)
{
for (int k = 0; k < n; ++k)
{
s = 2 * s + 1;
}
}
}
printf("%d\n", s);
return 0;
}
私はgdbを使って変数sの値を調べていました。私は、30回目の最内ループを実行しているときにsの値が負になる、つまり-1073741825になることを発見しました。次に、次の反復では2147483647になり、32回目の反復では-1になります。
それでは-1のままです。私の疑問は、値が-1になった後にラップアラウンドが起こらなかった理由です。私はバイナリでのsの値がすべて1であるか、または16進数でFFFFFFFFであることを知っています。そして、それは永遠に変わることはありません(内部的に更新していますが、最後の32ビットしか見ることができないので-1です)。しかし、このラップアラウンドは今度は画像に入っていませんか?コンパイラに依存していますか?あるいは、gccはラップアラウンドを1回だけ許可しますか? どんな種類の助けにも感謝します。ありがとう
短い回答:符号なしのタイプの場合、適切なラップアラウンドが保証されます*のみ*。署名付きの型では、技術的には定義されていないので、奇妙なことが起こる可能性があります。 –
'2 *( - 1)+ 1 = -1'なので、もう更新されません。 –