关于获取cpu字长的程序,该怎么处理
关于获取cpu字长的程序
网上看到一个获取cpu字长的程序,但是不明白是什么意思,请各位高手帮忙解释下,谢谢!
------解决方案--------------------
根据栈中两个连续存放指针的地址偏移量来计算字长。
指针长度==机器字长
------解决方案--------------------
这个程序,获得的结果还真不一定,得看 编译程序 是几位的了! WIN-TC 16位 这程序输出 16 ; VC6 输出 32 。 printf ("dummy2:%d\n",(long)&dummy2);
printf ("dummy1:%d\n",(long)&dummy1); 添加这2句,打内存地址打印出来看看就知道了!
------解决方案--------------------
存放dummy1和dummy2两个空指针变量的内存地址是连续的,例如一个是1245060,一个是1245064,则两者之差就是机器字长,正如楼上所说,指针长度==机器字长。
存储器是有一个一个8位的存储单元组成,计算机对每个8位的存储单元独立编址。
------解决方案--------------------
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;
}
------解决方案--------------------
传进去的参数是两个指针,也就是地址值,我们知道多少位的cpu它的地址值就最大表示多少,即64位最大表示2的64次方,16位最大表示2的16次方。又在编译原理中,long型变量一般占cpu个字节数,int型变量会根据实际需要由编译器设定字节数,一般是long型变量的一半或相等(好像不是4个字节就是2个字节)。这个函数最大的重点在于那两个参数的设定,不论你在什么情况下调用这个函数,它的两个形参在栈中(一段特定的内存区)的地址都是相连的,如果函数足够简单,他们甚至都不会进内存,在cpu的内部寄存器里他们就完成了数据传递,当然,一般情况是当函数发生调用,先把参数放到寄存器中,然后cpu会跳转到函数入口点,普遍情况接下来是先把参数压栈,这就是为什么两个形参的地址会相连了,当我们用&(取地址符)对其再次取地址,形成二级指针,因为两个指针型形参是一前一后被压入栈中的,而他们本身就是指针(即地址值),指针的特点就是cpu是几字节的它就占几个字节,所以它们的地址(内存)偏移量就是几,所以它们的二级指针的差值就是cpu的字节数,即8*字节数位的cpu。还有cpu是多少位的一般是指这种cpu的算术逻辑单元一次能够处理的二进制位数,或者是它的累加寄存器、位移寄存器是多少位的,不是它支持多大的寻址空间。亲,这不是一回事儿
网上看到一个获取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;
}
------解决方案--------------------
根据栈中两个连续存放指针的地址偏移量来计算字长。
指针长度==机器字长
------解决方案--------------------
这个程序,获得的结果还真不一定,得看 编译程序 是几位的了! WIN-TC 16位 这程序输出 16 ; VC6 输出 32 。 printf ("dummy2:%d\n",(long)&dummy2);
printf ("dummy1:%d\n",(long)&dummy1); 添加这2句,打内存地址打印出来看看就知道了!
------解决方案--------------------
存放dummy1和dummy2两个空指针变量的内存地址是连续的,例如一个是1245060,一个是1245064,则两者之差就是机器字长,正如楼上所说,指针长度==机器字长。
存储器是有一个一个8位的存储单元组成,计算机对每个8位的存储单元独立编址。
------解决方案--------------------
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;
}
------解决方案--------------------
传进去的参数是两个指针,也就是地址值,我们知道多少位的cpu它的地址值就最大表示多少,即64位最大表示2的64次方,16位最大表示2的16次方。又在编译原理中,long型变量一般占cpu个字节数,int型变量会根据实际需要由编译器设定字节数,一般是long型变量的一半或相等(好像不是4个字节就是2个字节)。这个函数最大的重点在于那两个参数的设定,不论你在什么情况下调用这个函数,它的两个形参在栈中(一段特定的内存区)的地址都是相连的,如果函数足够简单,他们甚至都不会进内存,在cpu的内部寄存器里他们就完成了数据传递,当然,一般情况是当函数发生调用,先把参数放到寄存器中,然后cpu会跳转到函数入口点,普遍情况接下来是先把参数压栈,这就是为什么两个形参的地址会相连了,当我们用&(取地址符)对其再次取地址,形成二级指针,因为两个指针型形参是一前一后被压入栈中的,而他们本身就是指针(即地址值),指针的特点就是cpu是几字节的它就占几个字节,所以它们的地址(内存)偏移量就是几,所以它们的二级指针的差值就是cpu的字节数,即8*字节数位的cpu。还有cpu是多少位的一般是指这种cpu的算术逻辑单元一次能够处理的二进制位数,或者是它的累加寄存器、位移寄存器是多少位的,不是它支持多大的寻址空间。亲,这不是一回事儿