int a=65535,int b=-1,printf("%d,%o,%x,%u", a, a, a, a); printf("%d,%o,%x,%u", b, b, b, b);结果
为什么结果是-1,177777,ffff,65535-1,177777,ffff,65535,可以具体说说怎么算的吗...
为什么结果是 -1,177777,ffff,65535
-1,177777,ffff,65535,可以具体说说怎么算的吗 展开
-1,177777,ffff,65535,可以具体说说怎么算的吗 展开
展开全部
这个啊,有符号的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进制的无符号数处理了。二进制、八进制、十六进制的转换很简单的。
展开全部
首先要搞清楚不同格式输出是怎么回事
格式字符 意 义
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),解释上面一样
总结:对于此题,搞清楚每个格式输出的意义,还有就是数字在电脑中的存储形式,为二进制,要求会转换,转换的方法有很多,你去查下吧
格式字符 意 义
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),解释上面一样
总结:对于此题,搞清楚每个格式输出的意义,还有就是数字在电脑中的存储形式,为二进制,要求会转换,转换的方法有很多,你去查下吧
追问
为什么65535的二进制为111....1111(16个1),111....1111(16个1)是-1的二进制,111....1111(16个1)的八进制为177777?有什么简便的方法算出来吗,谢谢
追答
他们的二进制是一样的,这是计算机的存储方式,正数是以原码存储,负数是以补码存储,就是显示的时候,你选的方式不同,结果就不同,对于111....1111(16个1)转换八进制,最简单的是,从低位开始,向高位每3位为一组,对应是十进制放在相应的位置上,例如111....1111(16个1),
1 111 111 111 111 111
1 7 7 7 7 7
这样就是177777了,其他的都一样,不相信,你可以试试
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
int是16位有符号整型,正数在计算机中以原码方式存储,负数则用补码形式存储。
-1是负数,以补码形式存储,即0xffff
65535的原码也是0xffff
所以有这样的结果也就不奇怪了。
补码:保持符号位不变,其他位按位取反(即反码)再加一,即可得到该数的补码
-1是负数,以补码形式存储,即0xffff
65535的原码也是0xffff
所以有这样的结果也就不奇怪了。
补码:保持符号位不变,其他位按位取反(即反码)再加一,即可得到该数的补码
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询