C语言——无符号数的机器表示

这篇博客通过示例展示了两个函数f1和f2,分别用于计算2的幂减一,探讨了它们在处理无符号整数23、24和30时的行为,以及当n超出范围时f2的浮点溢出情况。重点在于演示了整数溢出和浮点精度问题在实际编程中的体现。

(来自考研真题——原题见2017年的408计组真题)

通过实例理解:

#include<stdio.h>

//f(n)=2^(n+1)-1
int f1(unsigned n){
	int sum=1,power=1;
	for(unsigned i=0;i<=n-1;i++){
		power*=2;
		sum+=power;
	}
	return sum;
}
float f2(unsigned n){
	float sum=1,power=1;
	for(unsigned i=0;i<=n-1;i++){
		power*=2;
		sum+=power;
	}
	return sum;
}

int main(){
	unsigned u=0;
	printf("%u\n\n", u-1);//u-1的机器数为全一
	//注:2^32-1=4294967295

	unsigned i=0;
	if(i<u-1){
		printf("u-1在与无符号数i的比较中被看作无符号数\n\n");
	}

	printf("f1(23):%d\n",f1(23));
	printf("f1(23)十六进制形式:%x\n",f1(23));
	printf("f2(23):%f\n",f2(23));//23为使f2(n)的结果精确无舍入的最大n

	printf("f1(24):%d\n",f1(24));
	printf("f2(24):%f\n\n",f2(24));//采用了末位加1的舍入方法

	printf("f1(30):%d\n",f1(30));//f1(30)仍等于f(n)
	printf("f1(31):%d\n\n",f1(31));//f1(31)机器数为全1

	printf("f2(126):%f\n",f2(126));//126为使f2(n)的结果不溢出的最大n
	printf("f2(127):%f\n\n",f2(127));//机器数为7F80 0000H,即无穷大

	return 0;
}

输出结果:

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值