gpt4 book ai didi

c - 如何强制 C 将变量解释为有符号或无符号值?

转载 作者:行者123 更新时间:2023-11-30 14:38:21 25 4
gpt4 key购买 nike

我正在开发一个项目,我经常需要将某些变量解释为有符号或无符号值,并对它们进行有符号操作;然而,在多种情况下,微妙的、看似微不足道的变化将无符号解释交换为有符号解释,而在其他情况下,我无法强制 C 将其解释为有符号值,并且它仍然是无符号的。以下是两个示例:

int32_t pop();

//Version 1
push((int32_t)( (-1) * (pop() - pop()) ) );

//Version 2
int32_t temp1 = pop();
int32_t temp2 = pop();
push((int32_t)( (-1) * (temp1 - temp2) ) );

/*Another example */

//Version 1
int32_t get_signed_argument(uint8_t* argument) {
return (int32_t)( (((int32_t)argument[0] << 8) & (int32_t)0x0000ff00 | (((int32_t)argument[1]) & (int32_t)0x000000ff) );
}

//Version 2
int16_t get_signed_argument(uint8_t* argument) {
return (int16_t)( (((int16_t)argument[0] << 8) & (int16_t)0xff00 | (((int16_t)argument[1]) & (int16_t)0x00ff) );
}

在第一个示例中,版本 1 似乎没有将值乘以 -1,而版本 2 则这样做,但唯一的区别是在一种情况下将计算的中间值存储在临时变量中,而在另一种情况下则不这样做.

在第二个示例中,版本 1 返回的值是与版本 2 返回的值相同字节的无符号解释,版本 2 将其解释为 2 的补码。唯一的区别是使用 int16_t 或 int32_t。

在这两种情况下,我都使用有符号类型(int32_t、int16_t),但这似乎不足以将它们解释为有符号值。您能否解释一下为什么这些差异会导致符号的差异?我在哪里可以找到更多这方面的信息?如何使用第一个示例的较短版本,但仍然获得有符号值?预先感谢您!

最佳答案

我假设 pop() 返回无符号类型。如果是这样,则表达式 pop() - pop() 将使用无符号算术执行,该算术是模块化的,如果第二个 pop() 大于第一个,则回绕一个(顺便说一句,C 没有指定特定的求值顺序,因此不能保证哪个弹出值将是第一个或第二个)。

因此,您乘以 -1 的值可能不是您期望的差值;如果存在环绕,它可能是一个很大的正值而不是负值。

如果直接强制转换至少一个函数调用,则可以获得与临时变量等效的值。

push(-1 * ((int32_t)pop() - pop()));

关于c - 如何强制 C 将变量解释为有符号或无符号值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56674978/

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