C99仕様状態:算術右シフト符号付き整数の
E1 >> E2の結果は、E1右シフトE2ビット位置です。 E1に符号なし型がある場合、またはE1が符号付きの型と非負の値を持つ場合、結果の値はE1/2^E2の商の整数部分になります。 E1に符号付きの型と負の値がある場合、結果の値は実装定義です。私が知って興味
、その実装/コンパイラは11111....
の束として署名E1 >> 31
を扱わないでしょうか?マイクロコントローラ用
C99仕様状態:算術右シフト符号付き整数の
E1 >> E2の結果は、E1右シフトE2ビット位置です。 E1に符号なし型がある場合、またはE1が符号付きの型と非負の値を持つ場合、結果の値はE1/2^E2の商の整数部分になります。 E1に符号付きの型と負の値がある場合、結果の値は実装定義です。私が知って興味
、その実装/コンパイラは11111....
の束として署名E1 >> 31
を扱わないでしょうか?マイクロコントローラ用
ほとんどの組み込みコンパイラは、論理シフト(ゼロのシフト)の代わりに算術シフト(符号ビットのシフト)を好む傾向があります。
ようなプログラミングは、画面を有する例示的なデスクトップ・プログラミングの場合よりも、ハードウェアに非常に近いと遠くのユーザからのものであるので、符号付き数字は、組み込みシステムに幾分稀であるためと考えられます。
署名付きの数字は、後にすべてのユーザー・プレゼンテーションに他なりません。ユーザーに番号を印刷する必要がない場合は、非常に頻繁に署名された番号は必要ありません。
そしてもちろん、それは本当にで開始する署名数にシフトを使用するために、任意の意味がありません。プログラミングのキャリアの中で、私がそれをする必要がある時にシナリオに遭遇したことはありません。ほとんどの場合、そのようなシフトは単に偶発的なバグであることを意味します。
あなたは正しいif
ステートメントを使用せずにunsigned型を使用してシフト署名し、2の補数算術演算をシミュレートすることができます。例:
#include <limits.h>
unsigned int asr(unsigned int x, unsigned int shift)
{
return (x >> shift) | -((x & ~(UINT_MAX >> 1)) >> shift);
}
コード内で異なる符号なしの型とそれに関連付けられた最大値を使用する必要があります。その
これはこの質問と何が関係していますか? – Lundin
@ Lundin質問には直接関係しませんが、質問には関連しています。コードを通常のコメントに入れるのは難しいです。それはX Yの問題として答えます。算術右シフトを行うために '' 'に頼ることができないなら、どのように移植可能にすることができますか? –
数-1 .... 1111年ではなく、そのINT多くは32ビットではありません。 – user3528438
注:標準の古いバージョンは使用しないでください。 C標準はC11ではなくC99です。それは、テキストは非常に明確であると述べた。あなたのコードを移植したい場合は、それに頼らないでください。シフトでは未定義のビヘイビアも呼び出すことができます。標準の6.5.7p3(唯一の有効なバージョン)を参照してください。 – Olaf
また、符号付きを無視し、結果として「1」を生成する多くの32ビットの2の補数の実装。 '>'が算術シフトまたは論理シフトを実行するかどうかを指定しないように、標準は実際に注意深く言い表されています。 –