3

私はプログラミングが初めてで、プログラムに特定の数値を取り、それを2倍にしてから、ユーザー入力が何日も2倍になり続けようとしています。私はこのループを作成しましたが、動作しますが、最終的な数値は負になります。どうすればネガティブになるのを止めることができるのかわかりません。助けていただければ幸いです。

int main(void)
{

    int d;
    int s;
    float a;

    do
    {
        printf ("Please enter the amount of days in the month: ");
        d = GetInt();   
    } while (d > 31 || d < 28);

    do 
    { 
        printf("Please enter the amount of pennies you start will start with: ");
        s = GetInt();
    } while( s < 0);

    do 
    {    
        s = s * 2;
        d = d - 1;
        a = s / 100.0;
        printf("%f\n", a);

    } while(d > 0);

    return 0;
}
4

3 に答える 3

4

問題はここにあります:

s=s*2;

(ただし、ループの前など、常に変数を初期化する必要があります。)s=0

整数には、数値がストレージ タイプよりも大きくなった場合の特別な値がないため、オーバーフローします。

これが起こり得る例です。最初のビットが数値が負であることを意味する一連の 4 ビットとして整数を格納するとします。次に、システムでカウントを開始すると、次のようになります。

0000 = 0
0001 = 1
0010 = 2
0011 = 3
0100 = 4
0101 = 5
0110 = 6
0111 = 7
1000 = -0
1001 = -1
1010 = -2

このように、数値はコンピューター内で増加し続けていることがわかりますが、最上位ビットがオンになると、それらの数値が突然負の値に変換されます。

コンピュータは、負の数を格納するためにあらゆる種類の異なる方式を使用しますが、2 の補数が一般的です。これは、ここで説明するために使用したシステムよりも優れていますが、本質的な点は同じです: 数値が大きくなりすぎると負になるということです。クロスオーバーポイントの場合は、int打ったときが多いですが2^31、2147483648です。

回避策は を使用することunsigned intです。これは、表現できる最大数をおよそ 2 倍にするかlonglong longunsigned long、またはを使用しunsigned long longます。これで問題が解決するわけではないことを覚えておいてください。問題が発生する前に、作業できる大きな数値が得られるだけです。

limits.hヘッダー ファイルを使用して、使用可能な最大値を見つけることができます。の為intですINT_MAX

于 2013-03-05T22:00:30.737 に答える
1
2^31 = 2147483648

30 日を超えると、1 ペニーから始めて値を 2 倍にしても、整数がオーバーフローします。より多くのペニーから始めると、すぐにオーバーフローします。

整数がオーバーフローすると、負の値として表示されます。以下の提案によると、未定義の動作です。これはプログラマーが使用する用語であり、初心者はよく理解していません。

于 2013-03-05T22:06:36.973 に答える