比较整数提升后的结果

Comparing results after integer promotion

本文关键字:结果 整数 比较      更新时间:2023-10-16

以下情况:

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

#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并通过隐式将左值向下转换为uint8将左值分配给complementvar之后(
  2. 现在转到检查宏:按位操作会导致两边的整数提升?:
    • 2a(。var: 0000 0000 0000 0000 0000 0000 0000 0011complementvar: 1111 1111 1111 1111 1111 1111 1111 1100
    • 2b(\now对var和补码var进行异或,结果1111 1111 1111 1111 1111 1111 1111 1111
  3. 将XOR运算的结果与-1(表示为整数(一起检查1111 1111 1111 1111 1111 1111 1111 1111==1111 1111 1111 1111 1111 1111 1111 1111应该得到true,但我总是收到false,因为XOR运算的结果(对我来说很奇怪(是0x000000ff

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

补码运算complementvar具有值0xfffffffc之后

否。看看这个代码:

uint8_t complementvar;
complementvar=~var;

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

在您的检查步骤中,这将再次升级为int,但由于uint8_t无符号类型,因此此处没有符号扩展,您只添加了0位。这解释了您从xoring(^(得到的结果。