【问题标题】:C / C++ - signed char comparingC / C++ - 有符号字符比较
【发布时间】:2014-01-27 22:48:14
【问题描述】:

我正在尝试跳过 UTF-8 编码文件中的 BOM,但我在 ifs 中的测试失败:

int i = 0;

if( str[i] == '\0xef' ) {
    ++i;
}

if( str[1] == '\0xbb' ) {
    ++i;
}

if( str[2] == '\0xbf' ) {
    ++i;
}

我不知道为什么它们不起作用。有符号和无符号之间必须存在某种隐式转换,并且 Visual Studio 在调试时显示带有 2 个八位字节的字符代码,即使我使用的是 1 字节字符。

发生了什么事?谢谢你:)

【问题讨论】:

  • '\0xbf' 是多字节字符常量
  • str是如何定义的?是有符号的还是无符号的char数组?
  • 这是一个 const char *。我也试过 0xbf 而不是 '\0xbf' 但结果是一样的。
  • char 是 8 位有符号的,因此它的值在 -128..127 范围内。注意:0xbf > 127

标签: c++ c comparison byte signed


【解决方案1】:

你的代码应该是

int i = 0;

if( str[i] == 0xef ) {
    ++i;
}

if( str[1] == 0xbb ) {
    ++i;
}

if( str[2] == 0xbf ) {
    ++i;
}

【讨论】:

  • 感谢您的回答。我已经尝试过这种可能性,但它会导致相同的结果。
【解决方案2】:

定义十六进制字符常量的正确方法是'\xef'。在这种情况下,您的 str 应保持签名。

if( str[i] == '\xef' ) {
    ++i;
}

或者您可以将str 定义为unsigned char * 并与整数0xef 进行比较(由Chinna 提出)。

【讨论】:

  • 感谢您的帮助。我也试过了,但是 if 测试也失败了。
【解决方案3】:

问题是常量在此上下文中被解释为整数,因此得到值 239,而字符是符号扩展的。因为char 是在大多数x86 编译器(包括Visual Studio)上签名的,所以位模式0xef 被解释为负数,因此在扩展时会产生-17。这两个数字不相等。

尝试这样做:if ((unsigned char)str[i] == '\xef')

【讨论】:

  • 谢谢我试试这个。
猜你喜欢
  • 1970-01-01
  • 2012-09-30
  • 2021-11-19
  • 2016-02-08
  • 2013-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多