gpt4 book ai didi

c - 添加 32 位有符号 C

转载 作者:行者123 更新时间:2023-11-30 18:53:35 24 4
gpt4 key购买 nike

我遇到了这个问题,想在 C: 中解决它

假设您有一个 32 位处理器,并且 C 编译器不支持 long long(或 long int)。编写一个函数 add(a,b),它返回 c = a+b,其中 a 和 b 是 32 位整数。

我编写的代码能够检测上溢和下溢

#define INT_MIN     (-2147483647 - 1) /* minimum (signed) int value */ 
#define INT_MAX 2147483647 /* maximum (signed) int value */

int add(int a, int b)
{

if (a > 0 && b > INT_MAX - a)
{
/* handle overflow */
printf("Handle over flow\n");
}
else if (a < 0 && b < INT_MIN - a)
{
/* handle underflow */
printf("Handle under flow\n");
}
return a + b;
}

我不确定如何使用 32 位寄存器实现 long 以便我可以正确打印该值。有人可以帮助我如何使用下溢和溢出信息,以便我可以将结果正确存储在 c 变量中,我认为应该是 2 个 32 位位置。我认为这就是问题所在,当它暗示不支持那么长的时间时。变量 c 是否是 2 个 32 位寄存器以某种方式组合在一起以保存正确的结果以便可以打印?当结果超过或低于流量时我应该采取什么行动?

最佳答案

由于这是一个家庭作业问题,我会尽量不完全破坏它。

这里一个令人烦恼的方面是,结果比你允许使用的任何东西都大(我将 long long 的禁令解释为还包括 int64_t,否则就会有真的没有意义)。可能会倾向于选择“两个整数”作为结果值,但这解释它的值很奇怪。因此,我会选择两个 uint32_t 并将它们解释为 64 位二进制补码整数的两半。

无符号多字加法很简单,并且已经被介绍过很多次(只需搜索)。如果输入经过符号扩展,则带符号的变体实际上是相同的:(未测试)

uint32_t a_l = a;
uint32_t a_h = -(a_l >> 31); // sign-extend a
uint32_t b_l = b;
uint32_t b_h = -(b_l >> 31); // sign-extend b
// todo: implement the addition
return some struct containing c_l and c_h

显然,当解释为有符号时,它不能溢出 64 位结果。它可以(有时应该)换行。

要打印该内容,如果这是作业的一部分,请首先推断 c_h 可以具有哪些值。可能性并不多。使用现有的整数打印函数应该很容易打印(也就是说,您不必编写整个多字-itoa,只需处理几种情况)。

作为加法的提示:当您添加两位小数并且结果大于 9 时会发生什么?为什么7+6=13的低位是3?仅给出 7、6 和 3,如何确定结果的第二位数字?您应该也能够将所有这些应用到基数 232

关于c - 添加 32 位有符号 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32669679/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com