ercircle 发表于 2026-7-1 19:14:10

分享一个取反操作的细节问题

背景:有朋友移植代码到OS,因为开了全局可重入,函数返回类型bit改为u8,导致一功能异常



复现:

返回非0值,本不想进入if:
fun1,返回1时不进入if,正确
fun3,返回0xFF时不进入if,正确
fun2,返回1时进入if,错误

原因:

bit类型:
~0 == 1
~1 == 0
u8类型:
~0 == 0xFF
~1 == 0xFE,if(0xFE) 导致fun2调用处异常进入if。
~0xFF == 0

同类相关问题:






狂热主宰 发表于 2026-7-1 20:58:40

1bit的”0”
在8bit位宽下操作
原取值为00000000
“~0”后取值为11111111

1bit的”1”
在8bit位宽下操作
原取值为00000001
“~1”后取值为11111110

"0"和"1"取值于意料之外而也在规则之内

QQ624353765 发表于 2026-7-1 21:45:21

直接!fun1()不就行了

ercircle 发表于 2026-7-1 23:26:24

QQ624353765 发表于 2026-7-1 21:45
直接!fun1()不就行了



因为开了全局重入,编译报错,连函数返回类型一起改了,其实函数内不用bit就会消掉。

Ayb_ice 发表于 2026-7-2 08:17:51

用if( !!func())

18344371880 发表于 2026-7-2 08:35:47

U8的话,可以换个判断方式嘛,if ((~fun2()) & 0x01) { }

_奶咖君_ 发表于 2026-7-2 16:16:16

自命题?

还是某个时代编程习惯问题?{:4_194:}

有一种C语言考试题的感觉。

ercircle 发表于 2026-7-2 16:22:17

_奶咖君_ 发表于 2026-7-2 16:16
自命题?

还是某个时代编程习惯问题?


{:keai:}个人习惯问题吧,而且还和编译器相关,记sdcc对~bit操作自动提升类型。。

_奶咖君_ 发表于 2026-7-2 16:33:11

ercircle 发表于 2026-7-2 16:22
个人习惯问题吧,而且还和编译器相关,记sdcc对~bit操作自动提升类型。。
...

我的第一反应是 像是大学C语言期末考试卷上的题。。

如同
问题:
int i=5,j=5;
p=(i++)+(i++)+(i++);
q=(++j)+(++j)+(++j);
输出p和q的结果为多少?

这类的,知识点考察,但是可能不会出现在实际工作中的东西。{:4_171:}

页: [1]
查看完整版本: 分享一个取反操作的细节问题