int a=65535,int b=-1,printf("%d,%o,%x,%u", a, a, a, a); printf("%d,%o,%x,%u", b, b, b, b);结果

2025-02-03 04:46:01
推荐回答(3个)
回答1:

这个啊,有符号的int型的范围是-32768~32767,无符号的是0~65535。有符号的int数是采用补码表示的,int型是2个字节16位,最高位是符号位,0表示正1表示负。从负数的补码得到真值时,将符号位之外的所有位取反后,再加个1,前面再加个负号得真值。65535的十六进制表示是ffff,即二进制的1111 1111 1111 1111,最高位是1表示这是一个负数,将后面的111 1111 1111 1111取反,得000 0000 0000 0000,再加个1得000 0000 0000 0001即1,再添加个负号得-1,其实用补码来表示-1时,就是ffff。如果把ffff当无符号数看,自然就是65535了。%o那是8进制,应该是当做8进制的无符号数处理了。二进制、八进制、十六进制的转换很简单的。

回答2:

首先要搞清楚不同格式输出是怎么回事
格式字符 意 义
d 以十进制形式输出带符号整数(正数不输出符号)
o 以八进制形式输出无符号整数(不输出前缀0)
x,X 以十六进制形式输出无符号整数(不输出前缀Ox)
u 以十进制形式输出无符号整数
f 以小数形式输出单、双精度实数
e,E 以指数形式输出单、双精度实数
g,G 以%f或%e中较短的输出宽度输出单、双精度实数
c 输出单个字符
s 输出字符串
搞清楚了,就好解释了
第一:对于a=65535,其的二进制为111....1111(16个1),按%d输出,是有符号的,而111....1111(16个1)是-1的二进制(有符号),那么结果就是-1了,%u输出,无符号,结果就对了,111....1111(16个1)的十进制为65535,%o是按八进制输出,111....1111(16个1)的八进制为177777(不会转继续提问吧,查书也行),%x是按16进制输出,111....1111(16个1)的16进制为ffff,就是结果了;

第二:对于b=-1,上面说了,它的二进制也是一样的,为111....1111(16个1),解释上面一样

总结:对于此题,搞清楚每个格式输出的意义,还有就是数字在电脑中的存储形式,为二进制,要求会转换,转换的方法有很多,你去查下吧

回答3:

int是16位有符号整型,正数在计算机中以原码方式存储,负数则用补码形式存储。
-1是负数,以补码形式存储,即0xffff
65535的原码也是0xffff
所以有这样的结果也就不奇怪了。
补码:保持符号位不变,其他位按位取反(即反码)再加一,即可得到该数的补码