繁体   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