鱼C论坛

 找回密码
 立即注册
查看: 3779|回复: 8

[技术交流] C语言谜题系列2

[复制链接]
发表于 2011-8-3 08:35:23 | 显示全部楼层 |阅读模式
10鱼币
第二个谜题:一致程序如下,它会输出什么呢?
  1. #include<stdio.h>
  2. #include<limits.h>
  3. int main(){
  4.   short x;
  5.   for( x = SHRT_MIN; x<SHRT_MAX;++x ){
  6.     if( x == 0x9000 ) printf("JOY!\n");
  7.   }
  8. }
复制代码

说明:SHRT_MIN和SHRT_MAX是两个定义在limits.h中的宏,分别表示short类型的最小值和最大值。

最佳答案

查看完整内容

再简单点 0x9000 在32位下 不可能是负的 他就是个正的16进制9000 除非 你指定0x9000是16位 他才会是负的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-8-3 08:35:24 | 显示全部楼层
再简单点  0x9000 在32位下 不可能是负的 他就是个正的16进制9000
除非 你指定0x9000是16位  他才会是负的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2011-8-3 10:25:52 | 显示全部楼层
这题目嫩简单唉  啥都不输出 因为9000H根本不在范围内呗。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2011-8-3 14:56:54 | 显示全部楼层
- -.  感觉像脑筋急转弯!~唬人啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2011-8-3 17:54:55 | 显示全部楼层

确实不输出,但0x9000不在范围内?不会吧?0x9000按补码来说是个负数,在循环中肯定会遇到的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2011-8-3 19:17:59 | 显示全部楼层
0x9000如果当做有符号数是个负数,但是这里被认为是个无符号数,所以0x9000大于SHRT_MAX,就不会有什么输出来了
要想输出JOY可以改为这样if( x == (short)0x9000 ) printf("JOY!\n");
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2011-8-3 19:26:19 | 显示全部楼层
本帖最后由 仰望天上的光 于 2011-8-3 19:26 编辑

。。。0x9000是int类型的,int类型不是默认是有符号类型的吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2011-8-3 19:28:58 | 显示全部楼层
仰望天上的光 发表于 2011-8-3 17:54
确实不输出,但0x9000不在范围内?不会吧?0x9000按补码来说是个负数,在循环中肯定会遇到的。


你说的如果在32位机器下就错了  我VC6.0反汇编是这样的

因为short非32位
所以给word ptr [ebp-4]  = 8000 就是-32768
提升x到32位

movsx ecx,[ebp - 4]

cmp ecx,9000h;
相当于
FFFF8000h 与00009000h 比较   因为00009000h永远大于 32767 所以永远不会成立的

tC我机子没装 TC应该可以

所以你想表达的 应该这样写就对了
  • #include<stdio.h>
  • #include<limits.h>
  • int main(){
  •   short x;
  • short y = 0x9000;
  •   for( x = SHRT_MIN; x<SHRT_MAX;++x ){
  •     if( x == y) printf("JOY!\n");
  •   }
  • }


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2011-8-3 20:14:57 | 显示全部楼层
ccqiji 发表于 2011-8-3 19:31
再简单点  0x9000 在32位下 不可能是负的 他就是个正的16进制9000
除非 你指定0x9000是16位  他才会是负的

嗯,说得很好。
主要原因就是if( x == 0x9000 )
中short类型的x和int类型的数据比较,所以首先要将short类型的数据提升为int类型。又因为short是带符号的,所以发生了符号位扩展,所以当x的值为0x9000的时候,扩展为int后的x仍然是负数,而int类型的0x9000是正数,所以不会相等。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-26 17:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表