关于获取cpu字长的程序

TODD911 2013-03-22 04:34:36
网上看到一个获取cpu字长的程序,但是不明白是什么意思,请各位高手帮忙解释下,谢谢!

int cpu_bits(void *dummy1, void *dummy2)
{
long offset = (long)&dummy2 - (long)&dummy1;
int ret = 0;
if (8 == offset)
ret = 64;
else if (4 == offset)
ret = 32;
else if (2 == offset)
ret = 16;
else if (1 == offset)
ret = 8;
else
ret = -1;
return ret;
}

int main()
{
printf("%d\n", cpu_bits(NULL, NULL));
return 0;
}
...全文
450 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
皎月星辉 2014-06-26
  • 打赏
  • 举报
回复
C语言函数参数入栈顺序为从右至左
杨絮飞 2013-03-22
  • 打赏
  • 举报
回复
传进去的参数是两个指针,也就是地址值,我们知道多少位的cpu它的地址值就最大表示多少,即64位最大表示2的64次方,16位最大表示2的16次方。又在编译原理中,long型变量一般占cpu个字节数,int型变量会根据实际需要由编译器设定字节数,一般是long型变量的一半或相等(好像不是4个字节就是2个字节)。这个函数最大的重点在于那两个参数的设定,不论你在什么情况下调用这个函数,它的两个形参在栈中(一段特定的内存区)的地址都是相连的,如果函数足够简单,他们甚至都不会进内存,在cpu的内部寄存器里他们就完成了数据传递,当然,一般情况是当函数发生调用,先把参数放到寄存器中,然后cpu会跳转到函数入口点,普遍情况接下来是先把参数压栈,这就是为什么两个形参的地址会相连了,当我们用&(取地址符)对其再次取地址,形成二级指针,因为两个指针型形参是一前一后被压入栈中的,而他们本身就是指针(即地址值),指针的特点就是cpu是几字节的它就占几个字节,所以它们的地址(内存)偏移量就是几,所以它们的二级指针的差值就是cpu的字节数,即8*字节数位的cpu。还有cpu是多少位的一般是指这种cpu的算术逻辑单元一次能够处理的二进制位数,或者是它的累加寄存器、位移寄存器是多少位的,不是它支持多大的寻址空间。亲,这不是一回事儿
xiachun1980 2013-03-22
  • 打赏
  • 举报
回复
dummy1和dummy2这2个参数是先dummy2先进栈,后dummy1,而栈是由高地址向低地址,所以dummy2的地址-dummy1的地址,就是 一个 long offset .但是就是一个机器字长我不确定.我写的测试字长 int cpu_bits1() { int i=0; uint v=~0; for(i=1;v=v>>1;i++) { ; } return i; }
goog_guzl 2013-03-22
  • 打赏
  • 举报
回复
沉了吧,判断不了的
yinvictor 2013-03-22
  • 打赏
  • 举报
回复
存放dummy1和dummy2两个空指针变量的内存地址是连续的,例如一个是1245060,一个是1245064,则两者之差就是机器字长,正如楼上所说,指针长度==机器字长。 存储器是有一个一个8位的存储单元组成,计算机对每个8位的存储单元独立编址。
清天灵月 2013-03-22
  • 打赏
  • 举报
回复
这个程序,获得的结果还真不一定,得看 编译程序 是几位的了! WIN-TC 16位 这程序输出 16 ; VC6 输出 32 。 printf ("dummy2:%d\n",(long)&dummy2); printf ("dummy1:%d\n",(long)&dummy1); 添加这2句,打内存地址打印出来看看就知道了!
千树之影 2013-03-22
  • 打赏
  • 举报
回复
根据栈中两个连续存放指针的地址偏移量来计算字长。 指针长度==机器字长
TODD911 2013-03-22
  • 打赏
  • 举报
回复
引用 1 楼 starytx 的回复:
原理应该是根据long型占的字节数做出的判断吧?
具体呢?
TODD911 2013-03-22
  • 打赏
  • 举报
回复
引用 楼主 TODD911 的回复:
网上看到一个获取cpu字长的程序,但是不明白是什么意思,请各位高手帮忙解释下,谢谢! C/C++ code?12345678910111213141516171819202122int cpu_bits(void *dummy1, void *dummy2) { long offset = (long)&dummy2 - (long)&dumm……
具体呢?
starytx 2013-03-22
  • 打赏
  • 举报
回复
原理应该是根据long型占的字节数做出的判断吧?

69,371

社区成员

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

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