検討:
#include <stdio.h>
#define macro(a) a=a<<4;
main()
{
int a = 0x59;
printf("%x", a);
printf("\n");
macro(a)
printf("%x", a);
}
上記のコードでは、以下の出力が得られます。
59
590
左シフト演算として以下の出力が得られないのはなぜですか?
59
90
左シフトは、元の長さに合わせて数値を切り捨てません。を取得するには90
、次を使用します。
(a<<4) & 0xff
0x59
でありint
、おそらくあなたのプラットフォームではsizeof(int)==4
. 次に、それは0x00000059
です。それを 4 だけ左にシフトすると、 が得られ0x00000590
ます。
unsigned int
また、何をしているのかわからない場合は、ビットごとの演算子を扱うときに型を使用する良い習慣を身につけてください。右シフトのような状況では、それらは異なる動作をします。
16 進数を左に 4 桁ずらしたので、590 になりました。これは正しいです。
持っていた
000001011001
左に4ビットシフト
010110010000
16進数で590です
10010000
16進数で90であるため、 phoeagon0101
で示されているように削除することをお勧めします
%x を %d に変更すると、printf で =89 が得られ、左シフト後に = 1424 が得られます。
通常、10 進数 (基数 10) の場合
a = a<< n is a = a*2^n
a = a>> n is a = a/2^n
16 進数 (基数 16) の場合、
n (左または右) の任意のシフトは、対応する 2 進数の桁のシフトと見なすことができます。ただし、これは特定のコンパイラに使用される sizeof(int) に依存します。
あなたはintを使用しているので、次のようになります。
000001011001
左に4シフトすると、次のようになります。
010110010000
最初の8ビットだけを使用したい場合は、「int」を使用する必要はありませんが、unsigned char(またはchar)を使用する必要があります。
#include<stdio.h>
#define macro(a) a=a<<4;
main()
{
unsigned char a=0x59;
printf("%x",a);
printf("\n");
macro(a)
printf("%x",a);
}
それでもintを使用したいが、最初の8ビットだけを保持したい場合は、マスクを使用できます。
#define macro(a) a=(a<<4) & 0xFF
では、出力を0x90にするために何をすればよいか教えていただけますか?最後の4ビットを最初の4ビットにシフトして、最後に0を追加する必要があります
最後の4ビットを4ビット左にシフトし、最初の4ビットの代わりにそれを取得できる唯一の方法は、タイプに8ビットしかない場合です。通常、これはの場合であり unsigned char
、ではありませんint
。あなた0x90
は
unsigned char a=0x59;
macro(a)
しかしint
、結果を使用する0x590
と、エラーは<<
タイプの選択でのisの使用ではありません。(またはマクロの誤用?)