0

int 型は 4 バイトの長さで、入力した数値を出力するために Ubuntu の下で C で小さな手順を書きました。2147483648、つまり 2^31 を入力すると、-1 ではなく 2147483647 が出力されます。2147483647 より大きい任意の数値を入力すると、同じことが起こります。フォーム ブックで学習したように -1 にオーバーフローしないのはなぜですか?

#include <stdio.h>
int main(){
  int x;
  scanf("%d",&x);
  printf("%d\n",x);
}

私はミスを犯した。INT_Max+1 は INT_Min に等しくなければなりません。コードを変更しました:

#include <stdio.h>
int main(){
  int x=2147483647;
  int y=x+1;
  printf("%d",y);
}

-2147483648 関数 scanf を呼び出したときに何が起こったのか疑問に思っています。2147483647 より大きいすべての入力数値を 2147483647 に切り捨てたと思います。

4

3 に答える 3

3

C99 標準 6.5 式による:

式の評価中に例外的な条件が発生した場合 (つまり、結果が数学的に定義されていないか、その型の表現可能な値の範囲内にない場合)、動作はundefinedです。

ここを参照してください:

int i = 2147483648;
printf("%d",i);

http://ideone.com/07THjV

void main()

ちなみに帰りmainますint

于 2013-10-21T10:28:48.073 に答える
1

2147483647 の表現、つまり INT_MAX は0x7FFFFFFFです。
1 を追加すると、未定義の動作が発生します。
これは、実際には、1 を追加すると、0x80000000つまり -2147483648 になるということです。
バイナリ エンコーディングが0xFFFFFFFF.

#include <stdio.h>
#include <errno.h>

int main(){
  int val1 = 2147483647;
  int val2 = val1+1;
  int x;

  printf("errno before : %d\n",errno);
  scanf("%d",&x);                        //enter 2147483648 or a larger value
  printf("errno after : %d\n\n",errno);

  printf("val1 = %d (0x%X)\n", val1, val1);
  printf("val2 = %d (0x%X)\n", val2, val2);
  printf("x    = %d (0x%X)\n", x, x);

  return 0;
}

出力:

errno before : 0
errno after : 34 //0 if the entered value is in the range of 4-bytes integer

val1 = 2147483647 (0x7FFFFFFF)
val2 = -2147483648 (0x80000000)
x    = 2147483647 (0x7FFFFFFF)

取得する理由x=2147483647scanf、値を可能な範囲にクランプするためです。呼び出し後
に確認すると、 (コード 34)と等しいことがわかります。errnoscanfERANGE

于 2013-10-21T10:34:55.450 に答える
0

入力を16進数で読み取ることができ、適切な出力が得られます

int main(void) {
int a;

printf("\nEnter number :"); scanf("%X",&a);
printf("\n\n%d\n\n",a);

    return 0;
}

入力値: 80000000
出力は次のようになります:-2147483648
または、このように使用できます

printf("\nEnter number :"); scanf("%u",&a);

入力値: 2147483648
出力は次のようになります:-2147483648

于 2013-10-21T11:13:02.403 に答える