我有一个使用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”来自字符串,因此我无法更改其类型。
答案 0 :(得分:5)
问题在于签名(否定)字符。你可以试试
u += (unsigned) (c&0xff);
答案 1 :(得分:2)
这里的编译很好:
u += (unsigned char)c;
这只会使警告静音,但不会在运行时对每个c
执行任何操作,这与Basile的建议不同。
答案 2 :(得分: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;
在那里按预期工作。