【问题标题】:gcc(v4.1.2 cross-compiler) integer promotion problemgcc(v4.1.2 cross-compiler)整数提升问题
【发布时间】:2010-12-10 06:57:15
【问题描述】:

这是测试代码。

char ch = 0xff;
int i = ch;
printf("%d\n", i);

在 i386 gcc-4.4.5 中,输出为 -1。 但是在powerpc-e300c3-linux-gnu-gcc-4.1.2(MPC8315交叉编译器)中,输出是255

怎么了? 为什么 gcc-4.1.2 的输出是 255?

感谢您的回答...

【问题讨论】:

  • 我也遇到过这个问题。 char“通常”是签名的,但在 PowerPC Linux 上,它是未签名的。当我发现这一点时,我正在 PowerPC 上进行编码,并且有这个代码:unsigned char charflag[256]; ... charflag[c] & CF_WHITE。问题是,当c 是非ASCII 类型的字符时,当char 被签名时,它会导致负索引。解决方法是说charflag[(unsigned char)c],因为这样可以防止虚假符号扩展。
  • 将 255 的值赋给一个 char 无论如何都不是一个好主意:“否则,新类型是有符号的,并且值不能在其中表示;结果要么是实现定义的,要么是实现-定义的信号被提出。”您只能假设您可以在纯 char 中存储最多 127 个值。作为一个简单的规则,永远不要使用普通的char 进行算术运算。

标签: c++ c gcc char powerpc


【解决方案1】:

char 是有符号还是无符号由实现定义。

显然它在您的 x86 编译器上已签名,而在您的 PowerPC 编译器上未签名。

为了便于携带,请在您关心签名的任何地方使用unsigned charsigned char

【讨论】:

  • GCC 有 -fsigned-char 标志,强制 char 在所有平台上签名。这是移植代码的一个很好的快速修复,但您仍然应该养成看到char 的签名是实现定义的习惯。
  • 或者更好的是,如果真的关心变量的大小,最好明确说明。使用 stdint.h 标头(在 C99 及更高版本中) - 它具有 int8_t 和 uint8_t。虽然我真的不喜欢'_t's。
  • @Hex, char 始终为 1 字节,在绝大多数现代系统中为 8 位。此外,您可以在没有 _t 的情况下制作 typedef。
  • POSIX 要求 char 为 8 位,如果 char 不是,则 uint8_t 不能存在 在平台上(由于标准施加的冲突限制) 8 位。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-10
  • 2018-04-10
  • 2019-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多