c语言中关于输出函数的一个问题。

charcc=0362为什么printf("%d/n")结果是-14?unsigneduu=65534为什么printf("%d/n")结果是-2?老师上课说要转换为原码... char c c=0362 为什么printf("%d/n")结果是-14?

unsigned u u=65534 为什么printf("%d/n")结果是-2?
老师上课说要转换为原码算,为什么int型不要转换 到unsigned和char型就要转换了?
展开
 我来答
我已经匿名了
2014-10-12 · TA获得超过816个赞
知道小有建树答主
回答量:478
采纳率:0%
帮助的人:247万
展开全部
原因在于printf+%d时要求signed int型数据。如果不是,就要进行转换。

因为char c实际上是 (signed) char c,是有符号的,c=0362其实就是-2的八进制表示(一个字节)。
printf("%d", c);要求后面是有符号的整数,所以要先将c转为有符号的整型,即F2 FF FF FF(小端序 small endian))。这里因为c是负数,所以进行了符号扩展,体现在后面的两个FF。所以打印出-2。

你用的是编译系统unsigned为两个字节,unsigned short u =65534; 表示为16进制为FE FF FF FF(小端序),在printf+%d时要转为signed int型(也是两个字节),这里没有进行扩展,直接把FE FF FF FF解释成有符号整型数。第一个字节FE的二进制表示1111 1110的第一位解释为符号位,1表示负数。故根据补码的规则打印出-2。
追问
谢谢
种烧饼的怪叔叔
推荐于2016-04-24 · TA获得超过2214个赞
知道小有建树答主
回答量:824
采纳率:65%
帮助的人:451万
展开全部
1)为什么int不用转换,因为你的printf函数写着%d,也就是把变量转换成int类型再以10进制有符号整形输出。
2)c=0362这个,以0开头的数字被编译器当成八进制处理,转化成10进制就是242,因为一个char是一个字节的,又他是有符号的,所以以256取模,算得-14.
3)unsigned u u=65534结果是-2,这个可能出自课本,现在的计算机大部分都把int当做32位了,如果是以65535取模的话这个int应该是按照16位(2个字节)计算的。因为有前缀usigned ,所以说明他是无符号的,而有符号只能表示-32768~32767.所以值65534按照65535取模就是-2.
追问
谢谢
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
云淡风轻in苏州
2014-10-12 · TA获得超过599个赞
知道小有建树答主
回答量:418
采纳率:0%
帮助的人:555万
展开全部
char的范围是-128到127之间。unsigned范围是0到 2的32次方减1。
赋的值越界会发生反转而已。
unsigned u=65534 printf("%d/n")结果是-2没错
unsigned u=65534 printf("%d/n")结果是65534。
追问
谢谢
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式