uint8_t类型数据赋值给char,小心数据溢出

张开发
2026/6/7 19:05:57 15 分钟阅读
uint8_t类型数据赋值给char,小心数据溢出
例如uint8_t a0x96 char val_a a如果我的char是有符合类型此时val_a的值是多少答案val_a的值是-106。详细分析代码cuint8_t a 0x96; // a 150 (十进制) char val_a a; // char 是有符号类型计算过程a的值0x96十六进制 150十进制uint8_t是无符号8位整数范围 0~255赋值给有符号char有符号char范围-128 ~ 127150 超出此范围发生溢出溢出规则数据按二进制位直接拷贝不改变位值0x961001 0110(二进制)有符号char将最高位bit7解释为符号位最高位 1 → 负数数值部分 001 0110 22负数表示补码text原码-22 的补码表示 补码值 256 - 150 106 实际值 -106验证方式c#include stdio.h #include stdint.h int main() { uint8_t a 0x96; char val_a a; printf(a %u (0x%02X)\n, a, a); printf(val_a %d (0x%02X)\n, val_a, (uint8_t)val_a); return 0; }输出texta 150 (0x96) val_a -106 (0x96)图解表示方式值十六进制0x96二进制1001 0110作为uint8_t解释150作为int8_t解释-106text二进制位不变只是解释方式不同 1001 0110 (uint8_t) 150 1001 0110 (int8_t) -106核心原因C 语言中不同类型之间的赋值是按位拷贝不进行数值范围检查。数据在内存中的二进制表示不变但根据变量的类型有符号/无符号以不同方式解释。如果希望得到相同数值0~255应使用uint8_t或unsigned char类型cuint8_t a 0x96; uint8_t val_a a; // val_a 150

更多文章