c语言语言

来源:百度知道 编辑:UC知道 时间:2024/07/08 20:00:32
#include<stdio.h>
void main()
{
unsigned int a=65535;
int b=-2;
printf("a=%d,%o,%x,%u\n",a,a,a,a);
printf("b=%d,%o,%x,%u\n",b,b,b,b);
}
结果是
a=-1,177777,ffff,65535
b=-2,177776,fffe,65534
这个结果我完全看不懂啊``谁能详细的解释一下

-1在计算机中的存储形式是:
1111 1111 1111 1111
为什么是这样的呢,你应该先去书上或者网上复习一下“补码”的知识。大概可以给你说说,负数表示为它绝对值的反码加1。于是,1 表示为 0000 0000 0000 0001,按位取后,得到 1111 1111 1111 1110,把这个二进制值加1即得到-1的二进制形式。
printf("a=%d,%o,%x,%u\n",a,a,a,a);
这个是格式化输出。
%x 表示十六进制,根据我上面所说的(-1在计算中为1111111111111111),应该比较好理解。要是你还是理解不了 ,那你应该好好去看看书了,看看计算机中整数的二进制存储。
%o 表示八进制形式,1 111 111 111 111 111,我这样三位为一组,你就应该能看明白了吧。
%u,表示为无符号整型。1111 1111 1111 1111,按照二进制的规则,计算一下,弄成十进制,就是65535。它等于2的16次方减1。

这是分别用十进制、八进制、十六进制和无符号十进制方式列印的结果呀,根据你书写的情况,显然的你的机器是16位机,也就是说int和short一样都是16位的,16位按无符号表达范围是0-65535,按有符合则是-32768~32767(最高位被当作符号位),所以同样的内容按照有符号和无符号解释出来的结果是不一样的,这就是你打印出来的第一和最后一项的差异了,而八进制、十六进制是按无符号的,所以后3个除了进制不同其它一样