C语言之负数的左移/右移运算

文章目录

目录

前言

一、针对负数的左移运算

二、针对负数的右移运算

三、实例



前言

在实际上的开发中,很少碰到针对负数的移位操作,基本上都是无符号整数即unsigned int类型。但有时候在笔试或者面试中,有可能会碰到此类情况,下面就简单讨论一下。(若有错误之处,劳请大家指出)

一、针对负数的左移运算

此类情况跟正数的左移运算一样:移出去的丢弃,空出来的地方补0

二、针对负数的右移运算

C语言针对此类情况:空位补0还是补1,没有明确规定,若面试官或者笔试问起,该问题是没有答案的。不同的编译器可能会产生不同的情况。

三、实例

上代码

#include 

void main(void)
{
    char a = 0x93;   //10010011
    int b = a << 8 ;
    printf("0x%02x\n",b);
}

打印结果

0xffff9300 

 分析

a << 8:

1、由于C语言规定在进行位运算时数据会提升为int数据类型,char a 为有符号char类型,0x93的最高位为1,a为负数,所以a提升为int类型时左边补1,即int b = 0x ff ff ff 93;如果a的最高位为0(正数)或者a为unsigned char 类型,那么a提升为int 类型时左边补0,即 int b = 0x 00 00 00 93 

2、根据“负数左移后,空出来的地方补0”,最终得出int b = 0x ff ff 93 00

你可能感兴趣的:(c语言)