我有这个函数,通过访问每个对象中存储的数字,将两个十六进制数字一次一个字节地相加。然而,这有时会导致不正确的输出,我认为这是由于进位值错误造成的。
IntStatus_t intN_add(IntN_t opa, IntN_t opb, IntN_t* result)
{
uint8_t i = NBYTES;
uint8_t carry = 0;
uint16_t sum = 0;
do {
i--;
sum = opa.data[i] + opb.data[i] + carry;
if (sum > 255) {
result->data[i] = sum;
carry = (sum - 255);
} else {
result->data[i] = sum;
carry = 0;
}
} while (i > 0);
例如,
Provide an intN number in hex encoded form: 00 80 ff
Provide an intN number in hex encoded form: 01 80 01
The sum is:0x030100
返回 0x030100 而不是 0x20100。
这是错误的:
carry = (sum - 255);
如果将 200 和 200 加起来,您将得到 400,这应该是 400 - 256 = 144,进位为 1。但是,您的进位计算会给您一个数百个数字,这显然不是您想要的想要。