我试图比较字符串的第一个字符和十六进制常量来确定数据的类型.但每次失败.任何人都可以解释为什
char charray[] = {0xAA, 0x00, 0x02}; char ch = charray[0]; if (0xAA == ch) { printf("Equal\n"); }
Lundin.. 10
问题出在这里:
char charray[] = {0xAA, 0x00, 0x02};
char类型具有实现定义的签名,这意味着在某些系统上它将等同于signed char
.A signed char
只能存储高达0x7F的值,MSB将被视为符号位.这是你的情况下发生的事情,0xAA
被转换为有符号的值-86
(它是实现定义的,它得到的值是什么,我假设是两个补码).
然后该符号将保留在表达式中0xAA == ch
,因为ch
然后将其提升为类型int
并保留符号.这意味着你实际上将比较0xAA == -86
哪个是假的.
为了避免这样的错误,总是uint8_t
在字节级别上进行任何形式的算术时使用.
问题出在这里:
char charray[] = {0xAA, 0x00, 0x02};
char类型具有实现定义的签名,这意味着在某些系统上它将等同于signed char
.A signed char
只能存储高达0x7F的值,MSB将被视为符号位.这是你的情况下发生的事情,0xAA
被转换为有符号的值-86
(它是实现定义的,它得到的值是什么,我假设是两个补码).
然后该符号将保留在表达式中0xAA == ch
,因为ch
然后将其提升为类型int
并保留符号.这意味着你实际上将比较0xAA == -86
哪个是假的.
为了避免这样的错误,总是uint8_t
在字节级别上进行任何形式的算术时使用.