C语言的复值问题

来源:百度知道 编辑:UC知道 时间:2024/06/23 21:57:37
【2002年4月】(21) 在16位C编译系统上,若定义long a; ,则能给a赋40000的正确语句是
A) a=20000+20000;
B) a=4000*10;
C) a=30000+10000;
D) a=4000L*10L;
【答案】D
有人说 在C系统里,不加定义的数据默认的是int型.L是长整型 所以A B C都会出现溢出 但是 如果直接改成a=40000的话,我运行出来又是对的 不会发生什么溢出 这是为什么
我用的是16位的编译器 运行A B C的时候也确实会出现溢出

简单地说吧,就是A,B,C的情况下,计算机在把程序分解到最基础的指令时,20000,10000,30000,4000,10这些数据是用int型的空间来存放的,然后用这些内存空间的数据来计算,所以它会以为结果也是int型,所以产生溢出.
但直接写a=40000的话,在指令级层面就一句代码,直接把40000这个数写进一个4字节的变量,所以不存在int型的中间变量来周转,因此不会溢出.

你用的是32位的系统(编译器)吧!