分享一个取反操作的细节问题
背景:有朋友移植代码到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
同类相关问题:
1bit的”0”
在8bit位宽下操作
原取值为00000000
“~0”后取值为11111111
1bit的”1”
在8bit位宽下操作
原取值为00000001
“~1”后取值为11111110
"0"和"1"取值于意料之外而也在规则之内 直接!fun1()不就行了 QQ624353765 发表于 2026-7-1 21:45
直接!fun1()不就行了
因为开了全局重入,编译报错,连函数返回类型一起改了,其实函数内不用bit就会消掉。
用if( !!func()) U8的话,可以换个判断方式嘛,if ((~fun2()) & 0x01) { } 自命题?
还是某个时代编程习惯问题?{:4_194:}
有一种C语言考试题的感觉。 _奶咖君_ 发表于 2026-7-2 16:16
自命题?
还是某个时代编程习惯问题?
{:keai:}个人习惯问题吧,而且还和编译器相关,记sdcc对~bit操作自动提升类型。。
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]