C语言int 赋值问题

来源:百度知道 编辑:UC知道 时间:2024/05/15 15:52:52
#include<stdio.h>
main()
{
int a = 40000;
printf("%ld",a);

}
结果 a = 52796480 .
这结果是怎么得来的,哪位可以帮我讲讲过程.麻烦了

因为你要求它输出的是长整型(也就是64位的整数),
而你提供的参数是整数(只有32位)。

int a=40000;
只对4个字节进行了初始化,而输出时,将其当成了
一个8个字节的整数,换句话说,它还使用了另外4个你
没初始化的字节,所以当这4个已初始化的字节与4个
未初始化的字节合为一个8字节的长整数时,其值是不
确定的,也就得到了你看到的这个值(实际上,也可能
是其他值)。

楼上调试通过了,是因为在调试环境下,数据区会被清零,
这样相当于另外的未初始化的4个字节已被设置为0了。

为了验证上面的猜测,你可以看看下面这段代码的结果:

int c = 0;
int a = 40000;
int b = 0;
printf(\"%ld\",a);

在未调试时,看看它的输出结果是否40000;
然后改动c=1或b=1,再试试输出是什么。

祝你好运!

我觉得禹希初的分析很有道理。
好奇之下我也试运行了一下程序。奇怪的是在VC++ 6.0下,对于下面的程序段
int c = 1;
int a = 40000;
int b = 1;
printf("%ld\n",a);
输出结果居然还是40000。
查看了一下,内存地址分配如下:
&b: 0x0012ff70
b: 1
&a: 0x0012ff74
a: 40000
&c: 0x0012ff78
c: 1
汗~微软还是比较厉害!VC++ 6.0中b、c就分布在a的相邻4字节范围内,居然不对a从整型转换成长整型的输出起作用!

晕,会输出这个结果?
%ld是长整形数据,要看它的数据范围是多少了,感觉40000应该还在它的范围内。要是不在,则还可能输出这个结果,因为溢出了。

结果还是40000,是你的编译软件出问题了。程序本