当前位置:  开发笔记 > 编程语言 > 正文

比较始终以char和常量失败

如何解决《比较始终以char和常量失败》经验,为你挑选了1个好方法。

我试图比较字符串的第一个字符和十六进制常量来确定数据的类型.但每次失败.任何人都可以解释为什

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在字节级别上进行任何形式的算术时使用.



1> Lundin..:

问题出在这里:

char charray[] = {0xAA, 0x00, 0x02};

char类型具有实现定义的签名,这意味着在某些系统上它将等同于signed char.A signed char只能存储高达0x7F的值,MSB将被视为符号位.这是你的情况下发生的事情,0xAA被转换为有符号的值-86(它是实现定义的,它得到的值是什么,我假设是两个补码).

然后该符号将保留在表达式中0xAA == ch,因为ch然后将其提升为类型int并保留符号.这意味着你实际上将比较0xAA == -86哪个是假的.

为了避免这样的错误,总是uint8_t在字节级别上进行任何形式的算术时使用.

推荐阅读
围脖上的博博_771
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有