C语言陷阱:数据扩充 与 按位取反运算符“~”

目录

1.数据扩充问题

2.按位取反运算符"~"


1.数据扩充问题

首先,有些编程规范中禁止隐式类型转换。

其中很大的一个原因就是数据扩充问题,我们来看一个示例。

输出a>b

因为正数负数从低位向高位扩充时不同。正数扩充出来的高位将被填充为0,而负数会被填充为1。

uint8 的 -5 二进制为 0x 1111 1011,扩充完就会变成

0x 1111 1111 1111 1111 1111 1111 1111 1011 ,远远大于b。

我们在实际代码中可能遇到哪些场景?

Data = (uint32_t)(HumiData << 16) | TempData;

这样写有何风险?(湿度只有正,温度有正负)

很显然,如果温度为负数,则向上扩充的16位会全为1,然后或运算之后导致我们的湿度数据被直接拉满。

总结数据扩充的规则:

1.操作数全为有符号数,即使类型大小不一样,没有问题。

2.操作数全为无符号数,即使类型大小不一样,没有问题。

3.操作数混合了有符号数,无符号数,并且有正数有负数,很有可能出问题。

那么如果数据类型一致就不会有问题了吗?

2.按位取反运算符"~"

我们知道0xaa取反是0x55

但是这里输出结果却为

让我们做如下实验:

输出结果:

可知,~默认按32位操作,会自动做数据扩充,所以即使数据类型一致,也要多加注意,

要实现判断是否互为取反值,应该采用强制转换、&0xff、a&b == 0等方式来判断。

相关推荐
xu_yule7 小时前
Linux_14(多线程)线程控制+C++多线程
java·开发语言·jvm
c***97987 小时前
PHP在内容管理中的模板引擎
开发语言·php
San30.7 小时前
深入理解 JavaScript 异步编程:从 Ajax 到 Promise
开发语言·javascript·ajax·promise
XIAOYU6720137 小时前
2026大专跨境电商专业,想好就业考哪些证书比较好?
开发语言
2301_764441338 小时前
Python构建输入法应用
开发语言·python·算法
咨询QQ276998858 小时前
V-REP小车项目+匹配文档,基于V-REP与MATLAB联合仿真,小车能够完成循迹、避障、走...
开发语言
咩图8 小时前
C#创建AI项目
开发语言·人工智能·c#
豆沙沙包?8 小时前
2025年--Lc293-784. 字母大小写全排列(回溯)--java版
java·开发语言
珑墨9 小时前
【唯一随机数】如何用JavaScript的Set生成唯一的随机数?
开发语言·前端·javascript·ecmascript