找回密码
 立即注册
查看: 65|回复: 8

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

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:586
  • 最近打卡:2026-07-04 12:34:03
已绑定手机

112

主题

4958

回帖

1万

积分

荣誉版主

无情的代码机器

积分
10758
发表于 4 天前 | 显示全部楼层 |阅读模式
背景:有朋友移植代码到OS,因为开了全局可重入,函数返回类型bit改为u8,导致一功能异常



复现:
截图202607011906541198.jpg
返回非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

同类相关问题:
截图202607021623538928.jpg





三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:299
  • 最近打卡:2026-07-04 00:01:55
已绑定手机

66

主题

808

回帖

3037

积分

论坛元老

DIY玩家

积分
3037
发表于 4 天前 | 显示全部楼层
1bit的”0”
在8bit位宽下操作
原取值为0000  0000
“~0”后取值为1111  1111

1bit的”1”
在8bit位宽下操作
原取值为0000  0001
“~1”后取值为1111  1110

"0"和"1"取值于意料之外而也在规则之内
永怀这学徒心
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:520
  • 最近打卡:2026-07-01 21:45:21
已绑定手机

272

主题

432

回帖

2314

积分

金牌会员

积分
2314
发表于 4 天前 | 显示全部楼层
直接!fun1()不就行了

点评

[attachimg]142825[/attachimg] 因为开了全局重入,编译报错,连函数返回类型一起改了,其实函数内不用bit就会消掉。  详情 回复 发表于 4 天前
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:586
  • 最近打卡:2026-07-04 12:34:03
已绑定手机

112

主题

4958

回帖

1万

积分

荣誉版主

无情的代码机器

积分
10758
发表于 4 天前 | 显示全部楼层
QQ6243*** 发表于 2026-7-1 21:45
直接!fun1()不就行了

截图202607012325169368.jpg

因为开了全局重入,编译报错,连函数返回类型一起改了,其实函数内不用bit就会消掉。
三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:295
  • 最近打卡:2026-07-03 15:36:22
已绑定手机

22

主题

663

回帖

2480

积分

金牌会员

积分
2480
发表于 3 天前 | 显示全部楼层
用if( !!func())
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:800
  • 最近打卡:2026-07-05 02:49:42

30

主题

171

回帖

3366

积分

论坛元老

积分
3366
发表于 3 天前 | 显示全部楼层
U8的话,可以换个判断方式嘛,if ((~fun2()) & 0x01) { }
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:697
  • 最近打卡:2026-07-04 21:56:03

33

主题

3007

回帖

6880

积分

论坛元老

积分
6880
发表于 3 天前 | 显示全部楼层
自命题?

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

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

点评

个人习惯问题吧,而且还和编译器相关,记sdcc对~bit操作自动提升类型。。  详情 回复 发表于 3 天前
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:586
  • 最近打卡:2026-07-04 12:34:03
已绑定手机

112

主题

4958

回帖

1万

积分

荣誉版主

无情的代码机器

积分
10758
发表于 3 天前 | 显示全部楼层
_奶*** 发表于 2026-7-2 16:16
自命题?

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

个人习惯问题吧,而且还和编译器相关,记sdcc对~bit操作自动提升类型。。
三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:697
  • 最近打卡:2026-07-04 21:56:03

33

主题

3007

回帖

6880

积分

论坛元老

积分
6880
发表于 3 天前 | 显示全部楼层
erci*** 发表于 2026-7-2 16:22
个人习惯问题吧,而且还和编译器相关,记sdcc对~bit操作自动提升类型。。
...

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

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

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

参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-7-5 07:47 , Processed in 0.092629 second(s), 84 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表