C语言宏定义的问题

来源:百度知道 编辑:UC知道 时间:2024/04/29 23:20:54
代码如下:
/* check Define*/
#define N 10000
void main()
{
int a=N*10;
printf("%d",a);
}

不要运行,先说出结果,再运行!给我一个合理的解释!谢谢!
换成double ,float均为 0
就是 long int也无法取得正确的答案!

long int取值范围:-2147483648 至 2147483648 之间!

请告诉我再准确点的答案!谢谢!
-----------------------------
yimeng007 请说明你的编译环境!谢谢!
-----------------------------
xptlbx 和ttjack回答的很好,谢谢!ttjack回答的更专业一些!
不过ttjack即便这样:
--------------
/* check Define*/
#define N 10000
void main()
{
long int a=N*10; /*100000D = 11000011010100000B,int get 1000011010100000B */
printf("%ld",a);
}
--------------
还是输出负值!

谢谢二位精确的回答!我真的不知道选哪个好了!^_^!

您二位,说谁的答案更精确呢?我追加15分!呵呵!偶也是穷人嘛!^_^!

我选择xptlbx,因为xptlbx的两个提议都是正确无误的!而ttjack说的ld是不行的!
再次感谢二位精彩的答复!感谢了!

很正常啊,我说的是在你的机器上出现这个现象很正常。你的机器一定是16位的,所以int型不能表达100000这么大的数。可就算你把变量定义为long型,10000与10相乘系统还是要先用int型去计算,因此结果还是同样!要避免这个问题有两个办法:

1、long a = N * 10l; 注意10后面是字母l,表示长整数,这样强迫系统按照long型进行计算。

2、long a = (long)N * 10; 这个不用多解释了吧?

可以正常运行啊,结果是100000。上面的宏定义就是在程序预编译的时候就把程序中出现N的地方代替为10000,生成最终可以运行的程序。所以N*10就相当于10000*10。

超出int 的取值范围。。。具体的数不清楚 换成float 或者double可以得出结果。