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