如何判断系统是16位的还是32位的?不准用sizeof

wkq87 2011-09-26 02:18:16
RT,昨天的一道笔试题,拿出来大家讨论一下!
...全文
3598 104 打赏 收藏 转发到动态 举报
写回复
用AI写文章
104 条回复
切换为时间正序
请发表友善的回复…
发表回复
qwer_boo 2011-10-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 we_sky2008 的回复:]

C/C++ code

#define OS_BITS (((int)((int *)0 + 1)) << 3)
[/Quote]NB
用户 昵称 2011-10-08
  • 打赏
  • 举报
回复
[Quote=引用 102 楼 jiehu5114 的回复:]
引用 3 楼 we_sky2008 的回复:
C/C++ code

typedef int type;
#define OS_BITS (((int)((type *)0 + 1)) << 3)

这个就是正解、、、
[/Quote]
再想想
condlover 2011-10-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 we_sky2008 的回复:]
C/C++ code

typedef int type;
#define OS_BITS (((int)((type *)0 + 1)) << 3)
[/Quote]
这个就是正解、、、
uc_fly 2011-10-06
  • 打赏
  • 举报
回复
争论半天好像没神马结果嘛。。。
用户 昵称 2011-10-05
  • 打赏
  • 举报
回复
[Quote=引用 81 楼 hukui161 的回复:]
吃多了没事。
[/Quote]
[Quote=引用 82 楼 fly4free 的回复:]
让你用sizeof你也不一定能获得到……
[/Quote]
xiaoningning2 2011-10-05
  • 打赏
  • 举报
回复
不知道怎样才能区分我们得到的是编译器位数还是系统位数?
cnc10000 2011-10-04
  • 打赏
  • 举报
回复
在这里提供两套解决方案:
1:读取OS环境变量
2:用union
Roy_Smiling 2011-10-04
  • 打赏
  • 举报
回复
以上方法判断64位不行啊,64位的 int 也是32位的。
LouisScola 2011-10-04
  • 打赏
  • 举报
回复
mark, 很有用
VCACC 2011-10-04
  • 打赏
  • 举报
回复
Mark
fangzhaoguo 2011-10-04
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 liuguanghui1988 的回复:]
用移位
[/Quote]

这个和编译器有关呀
TC就是16bit的
VC就是32bit的
Gcc就不清楚了

像Java无论在什么机器上都是一样的
houzhenghui123 2011-10-03
  • 打赏
  • 举报
回复
零取反,然后向右一次移动16位,若移动一次变量为零,是16位,两次是32位,四次是64位。。。。
正在无聊中 2011-10-03
  • 打赏
  • 举报
回复

#if INT_MAX==65535
//16 BIT
#else
// 32BIT
#endif
正在无聊中 2011-10-03
  • 打赏
  • 举报
回复

#include<stdio.h>
#include<limit.h>
int main()
{
#if INT_MAX==65535
printf("16");
#else
printf("32/64");
#endif
return 0;
}
fly4free 2011-10-02
  • 打赏
  • 举报
回复
上边的2个楼层提到的方法,在高位系统中编译后,需要重新编译才能在低位系统下运行,否则根本启动不了。

如果在低位系统下编译的呢(低位指令输出),考虑到编译时已经确定了 数据类型,所以,不重新编译的话,在能够运行的系统中得出的结果只能是一样的。

比如:#define OS_BITS {(~0)>>16==0?16:32} ,

(~0)这个表达式结果值的二进制表示中有多少个1,是编译器确定的。如果默认数据类型是int, 如果目标机器指令是32位,那么其产生的是32位的移位指令,那么移位的结果也仅限于 EAX 寄存器的范围内,和RAX寄存器没什么关系。16位的同理是 AX范围内。不会有“寄存器的高位部分的1流入到低位部分”。

对于:#define OS_BITS (((int)((type *)0 + 1)) << 3)
这个导致的结果是什么不太清楚啊,毕竟编译器会把它优化成什么样,还不知道。。也许整个宏都会转换成在编译期间就已经计算好了的数呢,而没有任何的指令…………

看吧,都是编译器的问题。。。

不过…………
不知道是楼主写错标题了还是怎么,如你要判断 16位/32位。那么我肯定说的大部分准确。

如果还包括64位的话……也许现代的cpu硬件的实现,确实是会有“使用低位移位指令,那么整个寄存器的高位部分的1流入到低位部分”这样的情况。我目前对计算机体系的认知,还留在大学课本上。。。

总之,运行在windows上,尽量用api吧。。毕竟64位cpu的机器也是可以安装32位的winxp的啊~~

fly4free 2011-10-02
  • 打赏
  • 举报
回复
是不是忽悠你呢?
让你用sizeof你也不一定能获得到……
hukui161 2011-10-01
  • 打赏
  • 举报
回复
吃多了没事。
lida2003 2011-10-01
  • 打赏
  • 举报
回复
编译器屏蔽了硬件细节。应用层看不出什么内容,从OS内部或者驱动去获取详细信息吧。
三石君~Leo 2011-10-01
  • 打赏
  • 举报
回复
google
sanae 2011-10-01
  • 打赏
  • 举报
回复
借这个帖子再问一次
有木有利用Intel CPUID指令的环境和方案?

不是说CPUID能解决这个问题,而是问CPUID能解决问题的情境和方法
加载更多回复(77)

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧