2012-10-19 122 views
4

我有一個使用gcc版本4.6.3的項目,我不得不使用「-Wall -Werror -Wconversion」進行編譯。下面的簡單示例顯示了一個錯誤,我不能擺脫:C:如何擺脫轉換錯誤?

#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也不會使其消失。

可以解決這個問題嗎?

請注意,「字符」來自一個字符串,所以我沒有選擇改變它的類型。

+2

字符是/可以被簽名(即可能有負值),而uint32_t只能有正值。如果你是0而c是-1,你希望得到的結果是什麼? –

+0

它是字符串中的ASCII文本,所以我知道它們不是負值。 – brooks94

+0

@JoachimIsaksson:不保證'char'是否被簽名。它可以是:根據C99 6.2.5p15,它是實現定義的。 – netcoder

回答

2

這將編譯在這裏罰款:

u += (unsigned char)c; 

這隻會沉默警告,但是 - 沒有在運行時做任何事情到每個c,不像巴西萊的建議。

5

問題出在簽名(負數)字符。您可以嘗試

u += (unsigned) (c&0xff); 
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中的(可怕的)錯誤,並且鏗鏘似乎同意,u += (uint32_t)c;按照預期那樣工作。

+0

如果您覺得這是GCC bug,請在http://gcc.gnu.org/bugzilla/上報告。 –