比较整数提升后的结果
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 并将左值隐式转换为 complementvar
后 complementvar
=14=]).
- 现在检查宏:
按位运算导致双方的整数提升?:
- 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
- 与-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 (^
).
得到的结果
以下情况:
我有宏用于在结构中存储变量的补码及其原始值。使用另一个宏,我想检查原始值是否等于存储的补码值的补码。但奇怪的是,我没有得到我期望的结果。 简化操作,结果如下:
#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 并将左值隐式转换为complementvar
后complementvar
=14=]). - 现在检查宏:
按位运算导致双方的整数提升?:
- 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
- 2a).
- 与-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 (^
).