C:如何消除转换错误?

C:如何消除转换错误?,c,gcc,casting,C,Gcc,Casting,我有一个使用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; } 好的。只需添加一个类型转换,对吗?不。将第7行更改为u+=(uint32_t)c不会使错误消失。即使将其更改为u=u+(uint32

我有一个使用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;
}
好的。只需添加一个类型转换,对吗?不。将第7行更改为
u+=(uint32_t)c
不会使错误消失。即使将其更改为
u=u+(uint32_t)c
,也不会使其消失

有可能解决这个问题吗

请注意,“char”来自字符串,因此我无法更改其类型。

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

 u += (unsigned) (c&0xff);

这在这里很好:

u += (unsigned char)c;

但是,这只会使警告静音,而不会在运行时对每个
c
执行任何操作,这与Basile的建议不同。

问题是您想要哪种转换。如果需要标准定义的转换,显然需要将
c
赋值给(临时)
uint32\t
变量

uint32_t temp = (uint32_t)c;
u += temp;
按预期工作(至少适用于我的gcc-4.6.2)

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


在我看来,这是gcc中的一个(可怕的)错误,clang似乎同意这一点,
u+=(uint32_t)c按预期工作。

字符可以签名(即可以有负值),而uint32\u t只能有正值。如果u为0,c为-1,您希望得到什么结果?字符串中是ASCII文本,因此我知道它们不是负值。@JoachimIsaksson:
char
是否有符号无法保证。它可以是:它是实现定义的,就像C99 .62.5p15一样,你必须考虑字符串中的编码。字符串是什么类型的?是UTF-8还是简单的以null结尾的字符串?这决定了单个字符的字节宽度,因此您要将
char
添加到
uint32\u t
中,然后将其强制转换为
int
?为什么?
uint32_t temp = (uint32_t)c;
u += temp;