6

検討:

#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
4

5 に答える 5

10

左シフトは、元の長さに合わせて数値を切り捨てません。を取得するには90、次を使用します。

(a<<4) & 0xff

0x59でありint、おそらくあなたのプラットフォームではsizeof(int)==4. 次に、それは0x00000059です。それを 4 だけ左にシフトすると、 が得られ0x00000590ます。

unsigned intまた、何をしているのかわからない場合は、ビットごとの演算子を扱うときに型を使用する良い習慣を身につけてください。右シフトのような状況では、それらは異なる動作をします。

于 2013-03-06T09:02:53.793 に答える
6

16 進数を左に 4 桁ずらしたので、590 になりました。これは正しいです。

持っていた

000001011001    

左に4ビットシフト

010110010000

16進数で590です

10010000

16進数で90であるため、 phoeagon0101で示されているように削除することをお勧めします

于 2013-03-06T08:58:07.020 に答える
4

%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) に依存します。

于 2013-03-06T09:02:44.437 に答える
1

あなたは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
于 2013-03-06T09:05:21.637 に答える
0

では、出力を0x90にするために何をすればよいか教えていただけますか?最後の4ビットを最初の4ビットにシフトして、最後に0を追加する必要があります

最後の4ビットを4ビット左にシフトし、最初の4ビットの代わりにそれを取得できる唯一の方法は、タイプに8ビットしかない場合です。通常、これはの場合であり unsigned char、ではありませんint。あなた0x90

unsigned char a=0x59;
macro(a)

しかしint、結果を使用する0x590 と、エラーは<<タイプの選択でのisの使用ではありません。(またはマクロの誤用?)

于 2013-03-06T09:04:36.860 に答える