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)){