int isNegative(int x) {
return ((unsigned) x)>> 31;
}
私は32ビットをとり、xが<の場合は1を返し、そうでない場合は0を返す関数を作成しています。キャストせずに、符号付き整数を符号なし整数に変換するにはどうすればよいですか。キャストなしでsigned intからunsigned intに変換する
int isNegative(int x) {
return ((unsigned) x)>> 31;
}
私は32ビットをとり、xが<の場合は1を返し、そうでない場合は0を返す関数を作成しています。キャストせずに、符号付き整数を符号なし整数に変換するにはどうすればよいですか。キャストなしでsigned intからunsigned intに変換する
あなたの質問は32ビットを取り、これがどんなint
の大きさと任意の型変換を起動していない動作しません
int isNegative(int x) {
return x < 0;
}
x < 0
場合
1
を返す関数を書くことです。私はあなたがこの問題を熟考していると思います。
OPは異なる暗黙質問
そうでなければ32ビットを取り、1 < X場合は0を返し、0の機能を有しています。私はキャストなし
unsigned int
にsigned 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
自動型変換、特定の条件での算術演算、関数呼び出し(特定の引数値の変換)の中で、さまざまな操作が行われます。
したがって、あなたは、単にそれがパラメータの型であることを宣言することによって、unsigned int
に(signed
)int
引数の変換を実現できます。
int isNegative(unsigned x) {
return x >> 31;
}
は確かに、しかし、その機能のインターフェースは少し混乱することができます。そのため、これを行うことを好むかもしれません:
int isNegative(int x) {
unsigned ux = x;
return x >> 31;
}
しかし、私はそれらのいずれかがそのキャストで、あなたの元のバージョンと同様に明確であるとは思いません。タイプ変換はキャストの目的全体であり、変換が必要なもの(そして必要なものすべて)である場合、キャストはそのジョブに適したツールです。
もちろん、私は全体的に@chuxが提案するもっと簡単なアプローチの方が好きです。
なぜコードが単純に 'return x <0'でなく、"
chux
関数が32ビットのデータ型を取るようにするには、intではなく "long"です。 – Fredrik
キャストせずに変換する必要があるのはなぜですか?それはキャスティング*です*です。 –