2016-10-27 7 views
-1

私はC言語を使用しています。 "npu_session_total"という名前の関数があります。 次に、このfuncの戻り値を使用して、符号なしlong変数 "accelerated_count"に割り当てます。Cを使用してunsigned longにintを代入する方法は?

int npu_session_total(void) 
{ 
    // this will return an int 
    return atomic_read(&npu_session_count); 
} 
........ 
unsigned long accelerated_count = npu_session_total(); 

これは問題を引き起こしますか?どのようにキャストをすることができますか?

ありがとうございます!

+0

セッション数がマイナスになることはありますか?はいの場合、問題が発生します。セッション数はintの範囲を超えるでしょうか?はいの場合は問題あります。 –

+2

'int'から' unsigned long'への変換は暗黙的に行われます。あなたの行動に満足している限り、何もする必要はありません(つまり、負の値が 'ULONG_MAX 'を囲む)。言い換えれば、それはあなたが望む/期待していることによって「問題」を引き起こすでしょう。あなたはあまり言わない。 – AnT

+0

セッション数は正で、max_intの範囲内である必要があります。私は小さな正のint値を持っていると私はそれがうまくいくと思うので、私はそれをunsigned long変数に割り当てますか? – d22shen

答えて

2

intunsigned longに割り当てることは、OPのように簡単に行うことができます。それはCでよく定義されています。some_int_value >= 0の場合、常に変更されずにunsigned longに収まります。

INT_MAX <= UINT_MAX <= ULONG_MAX 

OPのように、キャスト、マスキング、または数学は必要ありません。

unsigned long some_unsigned_long_object = some_int_value; 

のトリックです。保存された値はsome_int_value + ULONG_MAX + 1になります。 @AnT OPのコードでこれはOKですか?おそらくそうではありません。

より安全な変換は、まず否定性をテストします。

int session_total = npu_session_total(); 
if (session_total < 0) { 
    Handle_Negative_Case(session_total); 
} 
else { 
    unsigned long accelerated_count = npu_session_total(); 
    ... 
} 

@OPコメントintマイナスになることはありませんこと。守備的なコーディングは依然として負の値を検出し、それを処理します。多分単純なエラーメッセージと終了。

+0

キャスト(変換)は暗黙的です。なぜなら、コンパイラは、暗黙の変換について確信していて、何をしているのかを知っていると仮定しているからです。つまり、この種のコードをコンパイルしようとすると、コンパイラのFLAGSをオフにしなければなりません。そうでなければ、[明示的なキャスト](http://ideone.com/gfpoMP)が必要です:= >> 'unsigned long accelerated_count =(符号なしlong)npu_session_total(); '。これは良い答えです。 – Michi

+0

あなたは正しいと思います。私にとっては、セッション数は常に正であると思っていましたが、それを印刷した後、私は一桁の負の値を見ました。私はそれらの否定的なケースを処理する必要があると思う。 "(unsigned long)npu_session_total()"だけでもいいですか? – d22shen

+0

@ d22shen '(unsigned long)npu_session_total()'は値を負から(unsigned long)の値に変更するだけです。要点は、コードが異なる機能を実行する必要があることです。 'session_total <0'をテストしてそれを分割してください。 – chux

関連する問題