题目大意是:在不使用sizeof()函数的情况下,取出本机的整形所占位数,如32位、64位等。
分析
在计算机中,常用的基本类型为:char、short int、long int、float、double。所以本体的巧妙之处在于,你不知道这个整形到底是长整形还是短整型。因此,不同的操作系统整形所占的位数长度是不同的。在常见的Windows操作系统中,int型其实是short int型;在其他的系统中则并不一定。
但是在所有计算机中字符型(char)均占用一个字节,其他类型都比int型长(或相等),因此这道题需要通过char类型来确定int型所占位数。
具体设计思路1如下:
- 申请一个整形变量并对其赋值
- 申请一个字符型数组,将字符型数组的首地址指向上面申请的整形变量
- 申请一个新的字符型数组和新的整形变量,并用新的数组首地址指向新的整型变量,将上面的字符型数组从头开始每一个元素对新的字符型数组进行赋值,赋值完后,比较两个整形是否相等,若想等则观察两个数组一共有几个元素相等,借此判断出整形占用几个字节
- 将字节转化为位数
上边的计思路1个人感觉有点绕了,其实没有这么麻烦的 ,直接用地址相减就可以了.
这个是别人给的代码
#include<stdio.h>
int calculate(); // 判断整形所占字节数int main()
{
// 输出整形所占位数,其中位数=字节数×8
printf("本台计算机整形所占位数为:%d\n", calculate() * 8);
return 0;
}
int calculate()
{
int ori; // 用于存放原整形
// C语言中整形申请不赋值会自动分配一个随机负数
int ret = 0; // 存放新数据
// 防止随机分配的某些字节与ori相同,对其赋0
char *orig = (char *)&ori; // 用于存放原数据
char *retu = (char *)&ret; // 用于存放新数据
//orig = (char *)&ori; // 将原整形地址赋值给orig数组首地址
//retu = (char *)&ret; // 将新整形地址赋值给retu数组首地址
int num;
for (num=0; num<8; num++) // 由计算机组成原理知,int不会大于8个字节
{
retu[num] = orig[num]; // 逐次赋值
/*
整型变量地址和数组的首地址相同,
若两整形值相同,
则说明在数组从零开始到整形所占字节数处,每个元素只都相同。
这里只需要取到第一次相同的值即可表明整形所占字节数
*/
if (ori == ret)
return ++num; // 返回整形所占字节数
}
return -1;
}
个人感觉这个程序是有些问题的.输出的结果是不对的.
把calculate()函数中的内容改成
int a[2] ;
int len = ((char *)&a[1] - (char*)&a[0])*8;
return len;
这代码是正确的.
源地址:http://blog.csdn.net/MichealGeng/article/details/45104663