2016-09-18 13 views
0
int isNegative(int x) { 
    return ((unsigned) x)>> 31; 
} 

私は32ビットをとり、xが<の場合は1を返し、そうでない場合は0を返す関数を作成しています。キャストせずに、符号付き整数を符号なし整数に変換するにはどうすればよいですか。キャストなしでsigned intからunsigned intに変換する

+4

なぜコードが単純に 'return x <0'でなく、" chux

+1

関数が32ビットのデータ型を取るようにするには、intではなく "long"です。 – Fredrik

+3

キャストせずに変換する必要があるのはなぜですか?それはキャスティング*です*です。 –

答えて

0

この場合、そうする必要はありません。あなたがキャストを取り除くと、右シフトは符号ビットを保持します。

intが32ビットであると仮定すると、キャストを削除すると、負の数は-1、非負の数は0になります。実際の戻り値は非負の場合で異なりますが、ブール値のコンテキストでは期待通りに動作します。

+2

詳細: "負の数は-1、非負は0"の結果は、一般的には実装定義の共通の動作です。 – chux

+0

回答は制限的ですが、DVは過剰です。 – chux

0

あなたの質問は32ビットを取り、これがどんなintの大きさと任意の型変換を起動していない動作しません

int isNegative(int x) { 
    return x < 0; 
} 

x < 0場合 1を返す関数を書くことです。私はあなたがこの問題を熟考していると思います。

3

OPは異なる暗黙質問

そうでなければ32ビットを取り、1 < X場合は0を返し、0の機能を有しています。私はキャストなしunsigned intsigned intを変換するにはどうすればよいのキャストせずにint型unsigned int型に署名した(と)
からの変換

int isNegative(int x) { 
    return x < 0; 
} 
// or maybe return bool/_Bool 
bool isNegative(int x) { 
    return x < 0; 
} 
// or pedantically 
int isNegative(int_least32_t x) { 
    return x < 0; 
} 
// or pedantically and nearly universally portable, 
int isNegative(int32_t x) { 
    return x < 0; 
} 

。単に値組み合わせこれら二つのリスクの実装動作を定義し、説得力のある理由のが与えられていない限り避けるべきであるに>>を使用しようと

int i; 
unsigned u = i; 

を割り当てる

例実装定義の動作の例は、符号付き整数が右にシフトされたときの上位ビットの伝播です。 C11§3.4.22

0

自動型変換、特定の条件での算術演算、関数呼び出し(特定の引数値の変換)の中で、さまざまな操作が行われます。

したがって、あなたは、単にそれがパラメータの型であることを宣言することによって、unsigned intに(signedint引数の変換を実現できます。

int isNegative(unsigned x) { 
    return x >> 31; 
} 

は確かに、しかし、その機能のインターフェースは少し混乱することができます。そのため、これを行うことを好むかもしれません:

int isNegative(int x) { 
    unsigned ux = x; 
    return x >> 31; 
} 

しかし、私はそれらのいずれかがそのキャストで、あなたの元のバージョンと同様に明確であるとは思いません。タイプ変換はキャストの目的全体であり、変換が必要なもの(そして必要なものすべて)である場合、キャストはそのジョブに適したツールです。

もちろん、私は全体的に@chuxが提案するもっと簡単なアプローチの方が好きです。

関連する問題