C 反转数组元素(按位)不';行不通

C 反转数组元素(按位)不';行不通,c,arrays,bit-manipulation,C,Arrays,Bit Manipulation,我今天尝试反转一个数组元素,但没有成功。有没有一个原因,例如 uint8_t array[2] = {0xFF,0x0A}; ... if( 0xF5 == ~(array[1]){ // never got here } 不起作用?编译器没有显示任何错误 if(0xF5 == ~(array[1])) 这是因为array[1]在应用反转之前被提升为int。因此,当您对数组[1]的提升值应用反转时,会得到:0xFFFFF5,它不等于0x000000F5 如前所述,如果要进行比较,可以将

我今天尝试反转一个数组元素,但没有成功。有没有一个原因,例如

uint8_t array[2] = {0xFF,0x0A};
...
if( 0xF5 == ~(array[1]){
   // never got here
}
不起作用?编译器没有显示任何错误

if(0xF5 == ~(array[1]))
这是因为
array[1]
在应用反转之前被提升为
int
。因此,当您对
数组[1]
的提升值应用反转时,会得到:0xFFFFF5,它不等于0x000000F5


如前所述,如果要进行比较,可以将等式运算符右侧的表达式强制转换为
uint8\u t

C在执行整数运算时将整数类型提升为
int
(或更大)。要获得所需的值,可以在比较之前将按位补码的结果向下转换为
uint8\u t
,如下所示:

if (0xF5 == (uint8_t) ~array[1]) {
    ...
}
~(数组[1])
求值到
~(0x0A)
。在一个平台上,
int
是一个32位数字,由于整数提升,这相当于
~(0x0000000A)
,这与
0xfffff5
相同

因此,
0xF5==~(array[1])
转换为
0xF5==0xfffff5
,其计算结果显然为false

为了使比较有效,可以使用另一个位运算符

if( 0xF5 == (~(array[1]) & 0xFF) )
这将确保除
=
运算符RHS上提升整数的最后一位之外的所有内容都已调零。

使用:

if (0xF5 == (uint8_t)~(array[1])){
或:


整数升级罢工again@canbus显示演示问题的最小编译示例。不清楚你想做什么。@harold我没有看到接线员~。:)谢谢,这很有趣。不知道。是的
array[1]
将被提升为
int
。假设
int
是32位,2的补码,~(array[1])将是
-11
,或
0xFFFFF5
。它的确切含义是什么?你能解释一下吗?@canbus C不能对小于
int
的类型进行算术运算。任何较小的值在操作之前都会隐式提升为“int”。@fuzzxl哦,我明白了。谢谢:)
if (0xF5 == (~(array[1]) & 0xFF)){