比较整数提升后的结果

Comparing results after integer promotion

以下情况:

我有宏用于在结构中存储变量的补码及其原始值。使用另一个宏,我想检查原始值是否等于存储的补码值的补码。但奇怪的是,我没有得到我期望的结果。 简化操作,结果如下:

#include <stdbool.h>
#include <stdint.h>
#define CHECKVAR(var__, compl__) ((var__^compl__)==-1);

int main()
{
uint8_t var;
uint8_t complementvar;

var=3;
complementvar=~var;

bool checkOK=CHECKVAR(var,complementvar); /*-> I expect that all bits are set and hereby it is equal to "-1", but instead i get "false" */

return 0;
}

我的期望是(例如在 32 位系统上:

  1. 补码运算后 complementvar 的值为 0xfffffffc(由 ~ 运算符将整数提升为 int 并将左值隐式转换为 complementvarcomplementvar =14=]).
  2. 现在检查宏: 按位运算导致双方的整数提升?:
    • 2a). var: 0000 0000 0000 0000 0000 0000 0000 0011; complementvar: 1111 1111 1111 1111 1111 1111 1111 1100
    • 2b)\ 现在对 var 和 complementvar 进行异或运算应该得到 1111 1111 1111 1111 1111 1111 1111 1111
  3. 与-1(以整数表示)一起检查异或运算的结果 1111 1111 1111 1111 1111 1111 1111 1111==1111 1111 1111 1111 1111 1111 1111 1111 应为真,但我总是收到假,因为异或运算的结果(对我来说很奇怪)是 0x000000ff?

我使用的是什么编译器?它是 MSVC++11,但实际上解决方案应该尽可能独立于编译器。 因为我也必须是可移植的,所以使用 C 编译器的结果会有所不同吗?

after the complement operation complementvar has the value 0xfffffffc

没有。看看那个代码:

uint8_t complementvar;
complementvar=~var;

~var 将计算为您期望的值,但 complementvar 的类型为 uint8_t,因此转换结果仅为 0xfc.

在你的检查步骤中,这又被提升为 int,但是由于 uint8_t 是一个 unsigned 类型,这里没有发生符号扩展,你只需添加 0 位即可。这解释了你从 xoring (^).

得到的结果