2.67-给你一个任务,编写一个过程int_ size_ is_ 32(), 当在一个int是32位的机器上运行时,该程序产生1,而其他情况则产生0。不允许使用sizeof运算符。下面是开始时的尝试:

这篇博客探讨了一段C语言代码在某些32位机器上无法正常运行的问题。代码尝试通过设置和检查最高有效位来判断整型变量的大小。在SUNSPARC这样的32位系统上,编译器警告提示左移操作超过了类型的宽度。为了解决这个问题,代码被修改以确保在至少32位的机器上正确运行,并提供了额外的修改以适应至少16位的系统。修正后的代码避免了超出类型宽度的左移操作,通过多次左移来达到目的。
摘要由CSDN通过智能技术生成

接题目:

/* The following code does not run properly on some machines */
int bad_int_size_is_32() {
	/* Set most significant bit (msb) of 32-bit machine */
	int set_msb = 1 << 31;
	/* Shift past msb of 32-bit word */
	int beyond_msb = 1 << 32;
	/* set_ msb is nonzero when word size >= 32
	beyond_msb is zero when word size <= 32 */
	return set_msb && !beyond_msb;
}

当在SUN SPARC这样的32位机器上编译并运行时,这个过程返回的却是0。下面的编译器
信息给了我们一个问题的指示:
warning: left shift count >= width of type
A.我们的代码在哪个方面没有遵守C语言标准?
B.修改代码,使得它在int至少为32位的任何机器上都能正确地运行。
C.修改代码,使得它在int至少为16 位的任何机器上都能正确地运行。

开始作答 官方答案(已验证)

A.要进行左移的数大于或等于x的宽度。
B.修改如下:

int bad_int_size_is_32() {
	int set_msb = 1 << 31;
	int beyond_msb = set_msb << 1;
	return set_msb && !beyond_msb;
}

C.关键就是在不能一次左移达到这个x的位数,不符合标准。

#include <stdio.h>
#include <assert.h>

/* The following code does not run properly on some machines */
int int_size_is_32() {
	int set_msb = 1 << 31;
	int beyond_msb = set_msb << 1;
	return set_msb && !beyond_msb;
}

int int_size_is_32_for_16bit() {
	int set_msb = 1 << 15 << 15 << 1;
	int beyond_msb = set_msb << 1;
	return set_msb && !beyond_msb;
}

int main(int argc, char* argv[]) {
	assert(int_size_is_32());
	assert(int_size_is_32_for_16bit());
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

榆钱不知秋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值