C:如何摆脱转换错误?

时间:2012-10-19 14:25:28

标签: 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;
}

使用上面的标志进行编译得出:

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

3 个答案:

答案 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;在那里按预期工作。