您的位置:首页 > 文旅 > 旅游 > 同城分类信息网站_太原网络营销_清远头条新闻_游戏推广员到底犯不犯法

同城分类信息网站_太原网络营销_清远头条新闻_游戏推广员到底犯不犯法

2025/7/1 16:34:34 来源:https://blog.csdn.net/jjjxxxhhh123/article/details/147142395  浏览:    关键词:同城分类信息网站_太原网络营销_清远头条新闻_游戏推广员到底犯不犯法
同城分类信息网站_太原网络营销_清远头条新闻_游戏推广员到底犯不犯法
  1. 不加 quint8 的写法:#define TO_SOURCE(A, B) (quint16)((A << 8) | B)
    潜在问题
    符号位扩展(如果 A 是负数)

如果 A 是 char 或 int8_t 且为负数(如 0xFF = -1),左移 << 8 会导致 符号位扩展,污染高位。

例如:

int8_t A = -1; // 0xFF
quint16 result = (A << 8) | 0x12; // 实际结果可能是 0xFFFF | 0x12 = 0xFF12(非预期)
整数提升(如果 A 或 B 小于 int)

C/C++ 会对小于 int 的类型(如 char)先提升为 int,可能导致意外行为。

例如:

char A = 0x80; // -128(有符号)
quint16 result = (A << 8) | 0x12; // 实际可能是 0xFF80 | 0x12 = 0xFF92(非预期)
数据截断(如果 A 或 B 超过 8 位)

如果 A 或 B 是 int 或更大的类型,直接位移可能保留高位垃圾数据。

例如:

int A = 0x1234, B = 0x5678;
quint16 result = (A << 8) | B; // 实际可能是 0x3400 | 0x5678 = 0x3478(丢失高位)
2. 加 quint8 的写法:#define TO_SOURCE(A, B) (quint16)(((quint8)(A) << 8) | (quint8)(B))
优点
强制类型安全

(quint8)(A) 确保 A 被截断为 无符号 8 位,避免符号位扩展。

例如:

int8_t A = -1; // 0xFF
quint16 result = ((quint8)A << 8) | 0x12; // 0xFF00 | 0x12 = 0xFF12(正确)
防止整数提升

quint8 是明确的 8 位无符号类型,避免隐式提升到 int。

数据范围明确

确保 A 和 B 仅使用低 8 位,忽略高位垃圾数据。

  1. 关键区别对比
    场景 不加 quint8 的写法 加 quint8 的写法
    A = -1(0xFF) A << 8 可能变成 0xFFFF(符号扩展) (quint8)A << 8 = 0xFF00(安全)
    A = 0x1234 A << 8 可能丢失高位(依赖 A 的类型) (quint8)A = 0x34,左移后 0x3400(明确)
    B = 0x5678 B 可能保留高位垃圾数据 (quint8)B = 0x78(安全)
  2. 何时可以不加 quint8?
    如果 能保证以下所有条件,可以不加:

A 和 B 的类型是 无符号 8 位(如 uint8_t、quint8)。

A 和 B 的值 不超过 8 位(即 <= 0xFF)。

不需要考虑跨平台兼容性(某些平台 char 可能是带符号的)。

但 最佳实践是显式转换,避免隐式错误。

  1. 完整代码示例
    (1)推荐写法(显式 quint8)

#include // 定义 quint8 和 quint16

#define TO_SOURCE(A, B) (quint16)(((quint8)(A) << 8) | (quint8)(B))

// 使用示例
quint16 result = TO_SOURCE(0x12, 0x34); // 0x1234
(2)危险写法(不加 quint8)

#define TO_SOURCE(A, B) (quint16)((A << 8) | B)

// 可能出错的情况
char A = -1; // 0xFF
quint16 result = TO_SOURCE(A, 0x12); // 可能是 0xFF12 或 0xFFFF(依赖平台)
6. 总结
写法 安全性 适用场景
(quint16)((A << 8) B) 低 仅当 A 和 B 是 无符号 8 位且值 <= 0xFF
(quint16)(((quint8)(A) << 8) (quint8)(B)) 高 通用场景,强制类型安全
结论:

必须加 quint8 以确保类型安全和预期行为。

不加 quint8 仅在极特定场景下可用,但风险高,不推荐。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com