[英]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.