C语言中char与0xFF比较判断广播MAC地址出错是什么原因?
问题原因
你遇到的问题根源是C语言中char类型的默认符号属性:
- 绝大多数编译器默认
char为带符号类型(signed char),取值范围是-128 ~ 127。你存储0xFF到signed char变量中时,二进制补码对应的实际值是-1。 - 你做比较时的
0xFF是int类型常量,值为255。当signed char类型的变量和int比较时,会触发整数提升:signed char的-1会被提升为int类型的-1(32位int下为0xFFFFFFFF),和255(0x000000FF)自然不相等,所以比较结果为false。
你看到的调试时分支被跳过的问题,是编译器优化导致的:编译阶段编译器就判定该比较条件永远为假,直接删除了分支内的无效代码,所以调试时会直接跳过分支。
解决办法
推荐从根源修正类型定义,MAC地址本身是无符号字节数据,把dir_mac_t结构体中数组的类型改为unsigned char即可:
typedef struct dir_mac_ { unsigned char dir_mac[TAM_DIR_MAC]; } dir_mac_t;
如果不方便修改结构体定义,也可以在比较时做强制类型转换:
bandera_prueba = (unsigned char)mac_destino[0] == 0xFF;
内容的提问来源于stack exchange,提问作者EmTor
相关产品推荐
相关产品推荐

