急求:溢出问题

来源:百度知道 编辑:UC知道 时间:2024/07/01 03:43:08
#include<stdio.h>
void main()
{int x;
x=50*50*50;
printf("%d\n",x);
}
运行结果是-6072
原因是溢出 但是请问这个错误的结果是如何算出来的? 还是随机的?
万分感谢

用int 溢出,说明你的编译器里面int是16位的,即2个字节.最高位是符号位.那么表示的最大范围是-32768~32767
而50*50*50在运算的时候,会不断的进位,导致最高位符号位变成非0.这个时候正数就变成了负数,产生了那样的结果.溢出的结果也不是随机的,而是如果计算的结果的二进制码超过了它的长度(比如你的编译器的int是2字节16位),超出的部分它不会再记录了.如果这个时候最高位符号位是1,那么就会显示一个负数给你.
你可以测试不同数据类型的字节长度.
比如 printf("%d\n",sizeof(int));你可以获得你的机器上编译器int的字节数.

#include<stdio.h>
void main()
{

short x = 50*50*50;
int y = 50*50*50;
printf("x:%d\n",x);
printf("y:%d\n",y);
printf("x:%x\n",x);
printf("y:%x\n",y);
}

x:-6072
y:125000
x:ffffe848
y:1e848

说明你的编译器里面int是16位的即4个16进制位
x:ffffe848
y:1e848

e848 == e848

故不是随机的

用long int

long int x;
x=50*50*50;
printf("%ld\n",x);

int变量范围 是32768-32767
你超过32767则 计算公式为-(x-32767)

溢出的结果一般都是随机的

用的是什么编译器?