c中的左移运算符

时间:2013-03-06 08:55:09

标签: c bit-shift

#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

5 个答案:

答案 0 :(得分:8)

左移 NOT 截断数字以适合原始数字的长度。要获得90,请使用:

(a<<4) & 0xff

0x59int,可能在您的平台上有sizeof(int)==4。然后是0x00000059。左移4,得到0x00000590

此外,在处理按位运算符时,养成使用unsigned int类型的好习惯,除非您知道自己在做什么。他们在正确的转变等情况下会有不同的行为。

答案 1 :(得分:6)

您将十六进制数字向左移动了4位,这样就得到了590,这是正确的。

你有

000001011001    

向左移4位

010110010000

是590的十六进制

10010000

是十六进制的90,因此您可能希望删除phoeagon所示的0101

答案 2 :(得分:4)

如果将%x更改为%d,则在printf中 你得到= 89 在左移后你会得到一个= 1424

通常用于十进制(基数为10)的数字

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

对于十六进制(16位)数字,

任何n(左或右)的移位都可以被认为是二进制等价数字的相应移位。但这取决于用于给定编译器的sizeof(int)。

答案 3 :(得分: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

答案 4 :(得分:-1)

  

那么请你告诉我应该怎么做以获得输出   因为90 ..我需要将最后4位移位到前4位加0   最后

唯一可以将4位最后4位向左移位并将其取代到前4位的唯一方法是,如果您的类型只有8位。通常情况属于unsigned char,而不是int

您希望90
unsigned char a=0x59;
macro(a)

但是int590 错误不是使用<<而是选择类型。 (或错过宏?)