![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-10-31 12:46 |
共 47,815 主题排行 / 349,930 发帖 / 今日 0 篇 / 48,290 会员排行 |
| DOS开发编程 & 发展交流 (开发室) » 求助!这是编译器(gcc和turboC)的bug吗???!!! |
| 可打印版本 870 / 5 |
| 第1楼 Loff | 发表于 2004-05-30 00:00 |
| 中级用户 发帖 59 积分 286 | |
|
求助!这是编译器(gcc和turboC)的bug吗???!!! #include
typedef unsigned int WORD;/*如果是用gcc,int型为32位,turboC则为16位*/ function(WORD parm) { if(parm&0x8000 == 0x8000) /*考虑到32位的情况,这里通过看参数的第15位(符号位)是不是为1,从而判断参数是否为负数*/ printf("parm is %d so,parm 0\n",parm); } main() { clrscr(); function(0x7777); function(0x7776); getch(); } 运行结果: parm is 30583 so,parm 0 无论是gcc还是turboC都是这样!如果你们的不是这样,难道我的cpu有问题?!当然,希望是我有哪个地方搞错了,望大家指出。 |
|
| 第2楼 aria | 发表于 2004-05-30 00:00 |
| 高级用户 发帖 243 积分 924 | |
|
用Visual Studio .Net
编译器指出这一句“if(parm&0x8000 == 0x8000)"优先级不明 我认为,编译器可能考虑为"if(parm&(0x8000 == 0x8000))" |
|
| 第3楼 bush | 发表于 2004-05-30 00:00 |
| 银牌会员 发帖 730 积分 2,165 | |
|
经测试:
&的优先级低于 == 不信你换用任意值:它都是先算==, 太奇怪了!!!!!!! |
|
| 第4楼 Loff | 发表于 2004-05-30 00:00 |
| 中级用户 发帖 59 积分 286 | |
|
谢谢两位,我加上括号后,问题解决了。
顺便问一下,如何在gcc的环境下使用16位的整型?或者根本就不行? |
|
| 第5楼 bush | 发表于 2004-05-31 00:00 |
| 银牌会员 发帖 730 积分 2,165 | |
|
现在才发现在优先级问题上我一直都有一个错误的认识:
打开TC的帮助文档可以看到: Page 319 Precedence of Operators Operator Order of evaluation () . -> left to right ! ~ - ++ -- & * (type) sizeof right to left * / % left to right + - left to right <> left to right < >= left to right == != left to right 我一直以为&的优先级高于== 其实这是一个美丽的误会: 只要再按一下:PageDown 就发现: Page 318 Precedence of Operators (cont) Operator Order of evaluation & left to right ^ left to right | left to right && left to right || left to right ?: right to left = += -= etc. right to left , left to right 又有一个& 原来,前一个是取地址运算,后一个才是与运算! 怪TC的帮助文档太简略,也怪自己不细心。 RHIDE的帮助文档还看不习惯,没找到写优先级的地方在哪儿…… 用short 取代int可定义16位整形 |
|
| 第6楼 Loff | 发表于 2004-05-31 00:00 |
| 中级用户 发帖 59 积分 286 | |
|
谢谢啦,我发现自己学习真的很不细致啊,以后要多用心了。
|
|
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |