C:如何摆脱转换错误?

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

#include  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”来自字符串,因此我无法更改其类型。

这里编译很好:

 u += (unsigned char)c; 

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

问题在于签名(否定)字符。 你可以试试

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

问题是你想要的转换。 如果您想要标准定义的转换,您显然需要将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中的一个(可怕的)bug,clang似乎同意, u += (uint32_t)c; 在那里工作。