4

我有一个使用 gcc 版本 4.6.3 的项目,我被迫使用“-Wall -Werror -Wconversion”进行编译。以下简单示例显示了一个我无法摆脱的错误:

#include <stdint.h>

int main(void) {
  uint32_t u = 0;
  char c = 1;

  u += c;
  return (int)u;
}

使用上述标志编译它会给出:

test.c:7:8: error: conversion to ‘uint32_t’ from ‘char’ may change the sign of the result [-Werror=sign-conversion]

好的。只需添加一个类型转换,对吗?没有。将第 7 行更改为u += (uint32_t)c不会使错误消失。即使将其更改为u = u + (uint32_t)c也不会使其消失。

有可能解决这个问题吗?

请注意,“char”来自一个字符串,所以我没有选择更改其类型的选项。

4

3 回答 3

5

问题在于有符号(负)字符。你可以试试

 u += (unsigned) (c&0xff);
于 2012-10-19T14:30:46.223 回答
2

这在这里编译得很好:

u += (unsigned char)c;

然而,这只会使警告静音c——不像 Basile 的提议,在运行时不对每个警告做任何事情。

于 2012-10-19T15:19:46.530 回答
1

问题是您想要哪种转换。如果您想要标准定义的转换,您显然需要分配c给(临时)uint32_t变量。

uint32_t temp = (uint32_t)c;
u += temp;

按预期工作(至少在我的 gcc-4.6.2 中)。

如果这不是预期的转换 - 但你为什么要明确要求它使用(uint32_t)c?- Basile Starynkevich 或 Mikhail T. 建议的解决方案,否则-funsigned-char标志将消除警告。

IMO 这是 gcc 中的一个(可怕的)错误,并且 clang 似乎同意,u += (uint32_t)c;在那里按预期工作。

于 2012-10-19T15:44:44.727 回答