免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3579 | 回复: 8
打印 上一主题 下一主题

整数自动转换原则 有些疑惑 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-03-10 16:53 |只看该作者 |倒序浏览
#include  <stdio.h>

main()
{
&nbsp;&nbsp;&nbsp;&nbsp;unsigned int a = 1;
&nbsp;&nbsp;&nbsp;&nbsp;int b = -10;
&nbsp;&nbsp;&nbsp;&nbsp;printf("%d\n",a+b);
&nbsp;&nbsp;&nbsp;&nbsp;(a+b > 6) ? printf("> 6") : printf("<= 6");  
}



这么一段代码,运行结果为:
$ ./a.exe
-9
> 6         

当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。

如果说>6这个输出是因为整形的自动转化。
那-9为什么是-9,而不是很大的一个正整数呢?

论坛徽章:
0
2 [报告]
发表于 2008-03-10 16:59 |只看该作者
有时候, 眼睛看到的也不一定是真实的.
你使用%x打印出来看看就知道了.

论坛徽章:
0
3 [报告]
发表于 2008-03-10 17:28 |只看该作者
前辈 我用%x
结果是
$ ./a.exe
fffffff7
> 6

fffffff7还是个负数阿,取补码加一依然是-9 阿

没有看出什么啊

论坛徽章:
0
4 [报告]
发表于 2008-03-10 17:35 |只看该作者

回复 #3 jojolin 的帖子

你不是也说了下面一句话吗?
当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。
那么a+b>6里面的a为无符号类型,此时都转化为了无符号类型了,就不再存在什么负数了.所以说你的6比这个小是正常的啊.

论坛徽章:
0
5 [报告]
发表于 2008-03-10 17:37 |只看该作者
其实什么都没有问题,它表现成什么在于你是怎么看他的,你在printf()里用的是%d当时是输出的是有符号的了,你试试用%u?

论坛徽章:
0
6 [报告]
发表于 2008-03-10 17:46 |只看该作者

回复 #4 scutan 的帖子

是啊 我就是想说printf("%d\n",a+b);为什么是负的不是正的。

呵呵 现在懂了 多谢。

论坛徽章:
0
7 [报告]
发表于 2008-03-10 17:46 |只看该作者

回复 #5 HelpMyself 的帖子

多谢 多谢

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
8 [报告]
发表于 2008-03-11 00:29 |只看该作者
一模一样的内存存储可以表达各种的信息
小端32位的一段4字节存储
00000000000000000000000000000001
既可代表4字节无符号整型2147483648,又可以代表4字节有符号整型-2147483648
还可以代表单精度-0.000000
这,完全取决于程序员想要它来表示什么

论坛徽章:
0
9 [报告]
发表于 2008-03-11 11:40 |只看该作者
cjaizss版主说的正是我想说的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP