4

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」は文字列に由来するため、タイプを変更するオプションがないことに注意してください。

4

3 に答える 3

5

問題は、署名された(負の)文字にあります。あなたは試すかもしれません

 u += (unsigned) (c&0xff);
于 2012-10-19T14:30:46.223 に答える
2

これはここでうまくコンパイルされます:

u += (unsigned char)c;

ただし、これは警告を消音するだけです— cBasileの提案とは異なり、実行時にそれぞれに何もしません。

于 2012-10-19T15:19:46.530 に答える
1

問題は、どの変換が必要かということです。標準で定義された変換が必要な場合は、明らかにc(一時)uint32_t変数に割り当てる必要があります。

uint32_t temp = (uint32_t)c;
u += temp;

意図したとおりに動作します(少なくとも私のgcc-4.6.2では)。

それが意図した変換ではない場合、しかし、なぜそれを使用して明示的に要求するの(uint32_t)cでしょうか?--BasileStarynkevichまたはMikhailT.によって提案された解決策、または-funsigned-charフラグは警告を排除します。

IMOはgccの(ひどい)バグであり、clangは同意してu += (uint32_t)c;いるようで、そこで意図したとおりに機能します。

于 2012-10-19T15:44:44.727 に答える