2012-01-23 11 views
1

私は符号付きと符号なしの数との比較をしていますCのモジュラス(数学関数)に相当しますか?

を言って警告を参照してくださいコードの一部を持っています。
int型のようなもの< = CONSTANT /はsizeof(表現)

これを修正するための最良の方法は何ですか?私は符号付き数値の係数を取って比較しますと思いますか?私は式のsizeof演算子で除算した後に符号なしの数値を得ることを意味します。だから、他の方法は、このrhsに署名することができます

これは私にこれをさせる機能がありますか?私はクイック検索を行い、彼らは明らかに私が探しているものではないモジュロの%を言う。

これは実際の警告

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

、これはコード

の実際の線である

関数A(.... ..、int num、.....){

アサート(num < = MAX_SIZE /はsizeof(INT)); // MAX_SIZEちょうど他の符合に片側キャスト

+3

質問に警告やエラーが記載されている場合は、おおよそのバージョンではなく実際の警告を書き留めておきたい場合があります。それに関連するコードを付けることができれば、さらに良いでしょう。 – Bart

+0

上記の元のコードと警告が追加されました。 – Manish

+0

質問は、 'num 'が取ることができる意図された許容範囲は何ですか?サイズ関連の式は、モジュロオペレータまたは「abs」関数を使用する目標がどのようなものになるのか、本当に不思議に思っています。 – moooeeeep

答えて

1

MAX_SIZE

1000年}の#defineです。符号なしの数値が負でないことを確認する必要があります。そうでない場合は、-1 < 100の比較では、(unsigned)(-1) == UINT_MAX - のように目的の結果は得られません。また、符号付きの数値をキャストするとオーバーフローしません。そのような場合は、それらを処理するための条件を追加します。上記特定の場合について

numが非負であることが保証されている場合numが負と

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

かもしれない場合、私は

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

を使用します。

+0

ありがとう!だから私の最初の質問に私をもたらすのは、モジュラス(私たちは数学で使っている)演算子ですか? | -5 | = 5をする何か? – Manish

+1

モジュラスの代わりに 'abs()'を意味しますか? – Bart

+0

符号なしの数値を符号なしの型にキャストするのは安全ですが、逆の方法はありません。 – dreamlax

2

右オペランドが< = INT_MAXの場合は、intにキャストできます。

int bla; 

... 

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

しかし、あなたはそれをキャストするよりもさらに良いでしょう(sizeof利回りという値の型である)size_tにオブジェクトblaの種類を変更することができます。

+1

OPは 'bla'が署名されているので、 'size_t'(unsigned)に変更するだけです。 –

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 */ 
); 
関連する問題