比较整数提升后的结果
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位系统上:
- 在补码运算
complementvar
具有值0xfffffffc
之后(在~运算符导致整数提升为int并通过隐式将左值向下转换为uint8
将左值分配给complementvar
之后( - 现在转到检查宏:按位操作会导致两边的整数提升?:
- 2a(。
var: 0000 0000 0000 0000 0000 0000 0000 0011
;complementvar: 1111 1111 1111 1111 1111 1111 1111 1100
- 2b(\now对var和补码var进行异或,结果
1111 1111 1111 1111 1111 1111 1111 1111
- 2a(。
- 将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编译器的结果会有所不同吗?
0xfffffffc
之后
否。看看这个代码:
uint8_t complementvar;
complementvar=~var;
~var
将计算为您期望的值,但complementvar
的类型为uint8_t
,因此转换仅为0xfc
。
在您的检查步骤中,这将再次升级为int
,但由于uint8_t
是无符号类型,因此此处没有符号扩展,您只添加了0
位。这解释了您从xoring(^
(得到的结果。
相关文章:
- 序列化,没有库的整数,得到奇怪的结果
- 尝试将字符串/字符转换为整数会产生意外结果
- 取消引用指向整数的指针时获得不同的结果
- AVX2 整数乘以有符号 8 位元素,产生有符号 16 位结果?
- 为什么 Clang 和 GCC 中两个无符号整数之和的结果类型不同
- 将较大的整数写为二进制并读回它们会产生不好的结果
- C++,概念不适用于无符号整数作为结果类型?
- 比较整数提升后的结果
- 如何将 xt::sum 表达式结果转换为整数
- 涡轮增压C++结果无法与长整数
- 为什么不同的整数声明会改变结果?
- 我可以将比较结果用作C++的整数吗?
- 为什么使用 int64_t 会产生错误的结果,而双精度则按预期进行简单的整数乘法
- std::reduce 似乎将结果转换为整数
- 从文本文件中读取并使用 sizeof 结果计算整数的数量到 nan
- 整数变量与整数字面变化的乘法结果
- 打印整数指针元素时的结果不同
- 整数异或C++的可能结果
- 如何使用字符串和整数获取汽车类的整数结果
- 使用不同的表达式计算同一整数时的结果不一致