《深入理解计算机系统》 练习题2.36答案

强制类型转换与其他运算的先后

int main(void)
{
	int x = -pow(2, sizeof(int) * 8 - 1); /* Tmin */
	int y = -1;

	auto z1 = (int64_t)x * y;
	auto z2 = x * (int64_t)y;
	auto z3 = (int64_t)x * (int64_t)y;
	auto z4 = (int64_t)(x * y);
}

在这里插入图片描述
注意z1变量,是先进行类型转换,然后再执行乘法,再会隐式地将y进行类型转换,再继续执行乘法。
z2,z3变量都是一回事。
注意z4变量,(x * y)这里还是int型的,所以这里正溢出,进行截断,还是-2147483648。然后进行类型转换,即进行位拓展,新拓展的位上的值都为1。

代码

此函数为初始版本,是用除法来检测的:

int tmult_ok(int32_t x, int32_t y)
{
	int32_t p = x * y;

	/* Either x is zero, or dividing p by x gives y */
	return !x || p / x == y;
}

先提前扩大两个数的范围,再执行乘法。
然后再进行截断,因为截断之后就相当于把乘积mod 2 32 2^{32} 232,取余 2 32 2^{32} 232的范围为【0, 2 32 2^{32} 232-1】。如果截断以后,值不相等,那么就出现溢出了。

int tmult_ok2(int32_t x, int32_t y)
{
	int64_t p = (int64_t)x * y; /*一定要先将右边手动转成 int64_t */
	/*printf("p=%" PRId64 ", q=%" PRId32 "\n", p,q);*/

	return p == (int32_t)p;
}

参考链接:
[1] https://github.com/vonzhou/CSAPP/blob/master/exercise/ex2-36.c
[2] https://github.com/haiiiiiyun/book_exercises/blob/master/csapp-v3/chap2/2.36.c

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值