预产期提前几天住院:一个关于C语言的程序问题?

来源:百度文库 编辑:高考问答 时间:2024/04/28 08:51:44
main()
{
unsigned int a;
a=-1;
printf("%d\n",a);
}
请高手说一下a的值是多少?
在编译器中运行后,a=-1.不可思意。
大家也许没有注意到我给a 开始赋值的时候就是无符号数,那为什么还会出现负值情况呢?????????无符号数的数值范围是0~65535而且-1在内存中的ascii码转换成无符号数就是65535。对不对。这是理论 上。但我在编译器中也是运行之后为-1。

数据在内存中都是二进制的,无符号的和有符号的数据,在内存中的表示是一样的.在内存中数据的表示都是补码,比如1在内存中表示为00000001,-1在内存中的表示为11111111.不管你是用什么有符号,还是无符号的,在内存中,数据都是这样表示的.
你定义了一个unsigned int a,只是在内存中开辟了一个两字节的空间,a=-1,a的值就是11111111,这就看你怎么理解这个数据了,如果你认为它是一个有符号的,第一个1就是符号,它是个负值,如果你认为它是个无符号的,第一个1就是数值的一部分.
你现在用的printf("%d",a),其实就是把这个数据理解为一个有符号的,如果是用printf("%u",a),就能达到你要的效果了.你还是对printf函数的理解不太清楚.
在C++里面,用cout,就不会出现这种情况.

因为你写的 %d 呀
如果你是写的printf("%u\n",a);输出的就是正数,不信试一试。

7楼的有道理

输入%ld\n试试看

puwei - 助理 三级 说的有道理。
楼主,“无符号数的数值范围是0~65535而且-1在内存中的ascii码转换成无符号数就是65535”。严格来说应该是-1的2进制代码转换成无符号数就是65535(-1没有ASCII码)。而%d输出的是有符号数,在把65535转换成有符号数就是-1了。程序把-1进行了2次转换。不信可以跟踪a的值看看。方法:ctrl+F7 输入a就行了。

你那个d%是整形