簡體   English   中英

C中的左移運算符

[英]Left shift operator in C

考慮:

#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的好習慣,除非您知道自己在做什么。 他們在右移等情況下有不同的行為。

您將一個十六進制數向左移動 4 位,得到 590,這是正確的。

你有過

000001011001    

左移 4 位

010110010000

是 590 十六進制

10010000

十六進制為 90,因此您可能想要刪除0101 ,如phoeagon所示

在您的 printf 中,如果您將 %x 更改為 %d,您將獲得一個 =89,左移后您將獲得一個 = 1424

通常用於十進制(基數為 10)數字

a = a<< n  is  a = a*2^n
a = a>> n  is  a = a/2^n

對於十六進制(基數 16)數字,

任何 n (左或右) 的移位都可以被認為是二進制等價物的數字的相應移位。 但這取決於用於給定編譯器的 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錯誤不是使用<<是類型的選擇。 (或濫用宏?)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM