1

という警告が表示されるコードがあります

符号付きと符号なしの数値を比較しています。
int <= CONSTANT/sizeof(expression) のようなもの

これを修正する最良の方法は何ですか? 符号付き数値のモジュラスを取得してから比較を行うと思いますよね? つまり、式を sizeof 演算子で除算した後、符号なしの数値を取得します。したがって、別の方法として、この rhs を署名済みにすることもできます

もしそうなら、私にこれをさせてくれるcの関数はありますか? 私は簡単な検索を行い、明らかに私が探しているものではないモジュロの % と言っています。

これが実際の警告です

警告: 符号付き整数式と符号なし整数式の比較

これが実際のコード行です

functionA( ......, int num, .....) {

assert( num <= MAX_SIZE/sizeof(int));// MAX_SIZE は #define MAX_SIZE 1000

}

4

3 に答える 3

2

正しいオペランドが <=INT_MAXであることがわかっている場合は、それを にキャストできますint

int bla;

...

if (bla < (int) sizeof expr) {
    ...
}

ただし、オブジェクトの型blasize_t(生成される値の型であるsizeof) に変更できる場合は、キャストするよりもさらに優れています。

于 2012-01-23T19:10:34.897 に答える
1

一方をもう一方の署名にキャストするだけです。それを unsigned にキャストする場合は、signed 数値が負でないことを確認する必要があります。そうしないと、の比較で-1 < 100目的の結果が得られない(unsigned)(-1) == UINT_MAXか、または unsigned にキャストした場合に unsigned 数値がオーバーフローしないことを確認する必要があります。そのような場合は、条件を追加してそれらを処理します。

上記の特定のケースでは、使用します

assert(num <= (int)(MAX_SIZE/sizeof(int)));
// num <= MAX_SIZE/(int)sizeof(int) if I'm in a mean mood

ifnumは負の可能性があり、

assert((unsigned)num <= MAX_SIZE/sizeof(int));

ifnumは非負であることが保証されています。

于 2012-01-23T19:09:40.363 に答える
1

これを見ると、int numは負の値と正の値を まで取ることができますMAX_SIZE/sizeof(int)numそうでなければ、確かに符号なし整数として宣言したでしょう...

この追加の条件によって主張ステートメントを拡張すると、あなたの場合に役立ちますか?

assert( num < 0 || /* make the signed check */
  (unsigned int)num <= MAX_SIZE/sizeof(int) /* the unsigned remainder */
  );
于 2012-01-23T19:44:59.760 に答える