#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
答案 0 :(得分:8)
左移 NOT 截断数字以适合原始数字的长度。要获得90
,请使用:
(a<<4) & 0xff
0x59
是int
,可能在您的平台上有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)
但是int
是590
错误不是使用<<
而是选择类型。 (或错过宏?)