C语言问题

main()
{unsigned short a;
int b=-1;
a=b;
printf("%u",a);
}
输出:65535
为什麽呢

main()
{int x=0,y=5,z=3;
while(z-->0&&++x<5) y=y-1;
printf("%d,%d,%d\n",x,y,z);
}
输出:3,2,-1
为什麽?

任何数据在计算机里都是以二进制补码形式存储的,不过正数的二进制补码形式和二进制原码形式一样,但负数的二进制补码形式是原码各位取反然后末位加1.假设编译环境中int型数据用32位存储,首位是符号位,值为-1的变量b在计算机中的形式是111……1(32个1)。由你说的那个65535可以推测你的编译器环境中unsigned short是用16位存储的,当把b的值赋值给a时,由于b位数多于a,c语言编译器会自动截断丢弃高位,这样赋值后a中存储的就是16个1.又因为你的printf中的%u,这表示要用无符号规则来读取第一个参数即a的值,这样16个1的二进制换算成十进制就是65535(不信你用等比数列求和公式算一下,最后就等于2的16次方减1)。

至于第二个程序,这种编程风格是极其不可取的,由于&&运算符规定,只有左表达式为真才计算右表达式,这样左表达式不同的值会造成右表达式可能被执行也可能不被执行,如果右表达式中有赋值等操作(比如自增自减等),可能造成程序的二义性。最好写成这个样子:
void main()
{
int x=0,y=5,z=3;
x++;
while(z>0&&x<5)
{
y=y-1;
z--;
++x;
}
printf("%d,%d,%d\n",x,y,z);
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2008-03-04
第一个:你定义了变量是无符号形的,负数在计算机里貌似是以补码形式存的,也就是说-1实际上存的是111111...就是一大堆1和最后一个0.给a了以后就成了65535.这个65535就是2的多少次方减一,因为计算机是二进制存储的.
第二个:要求两个条件都符合,z减三次后到0.此时while这个循环就结束了,而此时x正加到3.而y减到了2.z--到了-1.本回答被提问者采纳
第2个回答  2008-03-04
楼上的补码解释受教了,原来我说的是错的。额~

unsigned是正的,所以-1赋值是错的,至于为什么是65535我就不清楚了,不同的c程序遇见这种情况是不同的,有的遇见错误输出是随机数,有的就是一个循环的数。65535这个数很特别,不是吗?没记错的话应该是2的16次方--1,建议你把2的1--16次方都背过,电脑中很有用。

你的第二道题主要就是++和--的问题,自加自减号的前后很重要。课本上应该有详细解释,仔细看看
第3个回答  2008-03-04
第一个:跟acojoy一样!!
第二个:要求两个条件都符合,z减三次后,z=0,x=3,y=2;然后再回到while这个循环,z>0? No!z--;所以z=-1;在&&中。只要判断前一个条件是假的,循环就结束。所以输出:3,2,-1 ;
相似回答