【C语言】0x1F<<11等于0还是0xF800 ?

本文详细介绍了C语言中的左移和右移运算符,包括逻辑移位和算术移位的区别。对于左移运算符`<<`,即使是小数如0x1F,当左移超过其位宽时,结果会变为0。在右移运算符`>>`中,无符号数高位补0,有符号数算术右移会根据符号位填补。在实际编程中,需要注意移位操作可能导致的数据溢出问题,并给出了相关示例代码进行演示。
摘要由CSDN通过智能技术生成

1、左移运算符
格式:a<<b

将a这个数的各二进制位左移b位,要求b必须是非负整数,移动过程中,右边空出的位用0填补,高位左移溢出则舍弃该高位。

2、右移运算符
格式:a>>b

将a这个数的各二进制位右移b位,要求b必须是非负整数,移到右端的低位被舍弃。其中,
①对于无符号数,高位补0;
②对于有符号数,如果采用算术移位,则空出部分用符号位填补,如果采用逻辑移位,则用0填补。

(1)逻辑移位是指逻辑左移和逻辑右移,移出的空位都用0来补。
(2)算术移位就需要分有符号型值和无符号型值

  • 对于无符号型值,算术移位等同于逻辑移位。
  • 而对于有符号型值 ,算术左移等同于逻辑左移,算术右移补的是符号位,正数补0,负数补1。

(在汇编指令中,shl和shr表示逻辑左移和逻辑右移,sal和sar表示算术左移和算术右移。)

b的值相对于32位系统,要求不能超过32位,如果超过了,编译的时候会产生一个警告。

疑问:0x1F从字面上看,好像是一个字节的常量,如果左移8位,那该常量的结果为0还是0x1F00 ? ? ?

⭐⭐⭐答案:

  • 首先,将0x1F常量视为一个32位的常量,即0x0000001F,然后执行移位操作;此时,当移位超过32位,则结果为0。如果是long long修饰,那么视为一个64位的常量。
  • 如果,将0x1F赋值给一个小于等于32位类型的变量,对该变量进行以为操作时,先将变量的内容扩展成一个32位的值,然后执行移位操作(如果左移k位,则移动 k mod 32),等完成后,将32位的值赋值给变量,因为变量的类型不是32位,所以存在裁减。

示例:常量

#include <stdio.h>

int main(void)
{
	printf("%lld\n", ((long long)0x1F)<<32);
	printf("%d\n", 0x1F<<31);
	printf("%d\n", 0x80000000);
	printf("%lld\n", 0x1F<<32);
}

/*
运行结果为:
133143986176(0x1F 0000 0000)
-2147483648
-2147483648
0
*/

从左移31和左移32位的结果表明,如果是将0x1F变成64位,那么左移32位就不会变成0。

示例二:变量

#include <stdio.h>

int main(void)
{
	int a = 0x1f;
	long long b = 0x1F;
	a <<= 32;  //warning:left shift count >= width of type
	//a <<= 33;
	b <<= 32;
	printf("%lld\n", a);
	//printf("%lld\n", a);//62 (0x3E)
	printf("%lld\n", b);
}

/*
运行结果:
31(0x1f)
133143986176(0x1F 0000 0000)
*/

在这里插入图片描述

参考博客:
[1]:C语言之左移和右移运算符
[2]:C语言左移右移运算符详解
[3]:逻辑移位和算术移位的区别

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值