int_size_is_32(),判断int是否为32位
2012-04-23 17:17
225 查看
题目来自深入理解计算机系统习题2.67,题目描述:编写一个函数int_size_is_32(),当在一个int为32位的机器上运行时,返回1,而其他情况返回0,不允许用sizeof操作符。
首先进行的尝试:
问:
A.这个代码在哪个方面没有遵守C语言标准
B 修改代码,使它在int至少为32位的任何机器上都能正确的运行
C 修改代码,使它在int至少为16位的任何机器上都能正确的运行
对于A,移位数量可能会大于等于字长,在这里,个人推测是SUN的那32位机器里,int是16位表示,所以会有警告超出
对于B,不用修改即可
对于C,可以修改如下:
深入理解计算机系统还真是本好书,慢慢来吧
首先进行的尝试:
int Is_Int_32() { int set_msb = 1 << 31; int beyond_msb = 1 << 32; return set_msb && !beyond_msb; }一般情况下运行良好,但是在SUN PARC这样的32位机器上运行时,过程返回为0.编译器提示如下:
问:
A.这个代码在哪个方面没有遵守C语言标准
B 修改代码,使它在int至少为32位的任何机器上都能正确的运行
C 修改代码,使它在int至少为16位的任何机器上都能正确的运行
对于A,移位数量可能会大于等于字长,在这里,个人推测是SUN的那32位机器里,int是16位表示,所以会有警告超出
对于B,不用修改即可
对于C,可以修改如下:
int Is_Int_32_2() { int i=1; int digit_count=1; while ((i=i<<16)>0) digit_count++; return digit_count==2 ? 1:0; }不用移位计算可以计算判断int是否32位也可以利用指针的特性,指向int的指针每次加1,增加的空间则为一个int的大小,示范代码如下:
int Is_Int_32_1() { int i=1; return (int)(&i+1)-(int)(&i)==4 ? 1:0; }如果要判断操作系统是否32位呢?则可以利用指针的另一个特点了:指针大小一般等于机器字长,采用二级指针,每次加1,则为一个指针的大小,示范代码如下:
int Is_OS_32() { char *p="ab"; char **q = &p; return (char)(q+1)-(char)(q)==4 ? 1:0; }
深入理解计算机系统还真是本好书,慢慢来吧
相关文章推荐
- is_int is_float 判断数值是否为整数
- if(StringUtils.isNotEmpty(id)&&StringUtils.isNotEmpty(expertId)){//进行判断是不是id和选择专家的id判断是否为空
- 判断int类型是否为空
- int、long、long long取值范围 实例: 判断是否超出整形范围
- is_executable 判断给定的文件名是否是可执行的文件
- PHP函数补完:判断变量是否为数字is_numeric()
- C# 判断字符串是否int类型
- Android判断是否触发ellipsize="end"(即textview是否换行)
- WIN7批处理中判断系统是否是32位
- IOS判断设备是否已越狱(isJailbroken)
- php判断是否isPhone、is_weixin
- PHP - Manual手册 - 函数参考 - Filesystem 文件系统函数 - is_file判断给定文件名是否为一个正常的文件
- 判断变量是否不为空,函数isset()、!empty()与!is_null()的比较
- POJ——1308Is It A Tree?(模拟拓扑排序判断有向图是否为树)
- PHP判断变量是否存在及函数isset() 、empty()与is_null的区别
- 判断C#中的字符串是否是数字,如果是转换成int类型
- is_finite 判断是否是有限值
- 用最简单的函数实现功能:判断一个int数据是否是2的x次幂(不能使用循环)。
- 给定两个int数输入 判断其和,差,乘积是否是偶数 并返回偶数的个数
- canvas 使用 isPointInPath() 判断鼠标位置是否在绘制的元素上