【C语言】0x1F<<11等于0还是0xF800 ?
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]:逻辑移位和算术移位的区别
【C语言】0x1F<<11等于0还是0xF800 ?相关推荐
- C语言中判断浮点数是否等于0
1.C语言中判断浮点数是否等于0: 2.C语言中判断两个浮点数是否相等: float.double分别遵循R32-24,R64-53的标准.他们尾数的位数分别是23.52,即误差在2^-23,2^-5 ...
- 为什么我手机的科学计算机算的不对,手机计算器全线阵亡怎么回事 10%+10%为什么等于0.11...
手机计算器全线阵亡怎么回事?这是OPPO.华为.苹果.小米手机都出现的计算bug,计算"10%+10%"时,居然等于0.11,而不是0.2,那么手机计算器全线阵亡怎么回事?八宝网带 ...
- 二进制的前导的零 — C语言【十进制转二进制分大于0,小于0和等于0】
题目: 计算机内部用二进制来表达所有的值.一个十进制的数字,比如24,在一个32位的计算机内部被表达为00000000000000000000000000011000.可以看到,从左边数过来,在第一个 ...
- c语言n1=(n2=(n3=0)),计算机二级C语言考试选择题(带答案)
C语言是一种计算机程序设计语言,它既具有高级语言的特点,又具有汇编语言的特点.全国计算机等级考试有二级c语言这个考试的项目.2016年的计算机等级考试即将到来了,同学们复习的怎么样了?下面是一份相关的 ...
- 有小数点是什么类型_为什么0.1+0.2不等于0.3?原来编程语言是这么算的……
打开你的 Python,输入「0.1+0.2=」,结果是多少?0.30000000000000004 对不对?为什么结果不是 0.3?本文作者给出了详细的解释. 选自Medium,作者:Parul M ...
- Oracle Linux 6.9安装和Oracle 11.2.0.4.0安装及psu补丁升级
原文有图图https://www.linuxidc.com/linux/2018-09/154218.htm 图文详解在Oracle Linux 6.9安装和Oracle 11.2.0.4.0安装及p ...
- Oracle Linux6.9下安装Oracle 11.2.0.4.0及psu补丁升级
为方便截图,本文操作都在vmware虚拟机上完成. 目录: 1.操作系统安装 2.数据库安装 3.PSU补丁升级卸载 part1 操作系统安装 Oracle (Enterprise) Linux 是一 ...
- 【转】:Oracle Linux6.9下安装Oracle 11.2.0.4.0及psu补丁升级
为方便截图,本文操作都在vmware虚拟机上完成. 目录: 1.操作系统安装 2.数据库安装 3.PSU补丁升级卸载 part1 操作系统安装 Oracle (Enterprise) Linux ...
- Oracle Database 11.2.0.1(静默安装)
http://www.cnblogs.com/ylqmf/archive/2012/04/16/2451211.html 本文档是Oracle Database 11.2.0.1 for RHEL5 ...
最新文章
- android shape.xml 文件使用
- PHP7不能用string类名,thinkphp在php7环境下提示Cannot use ‘String’ as class name as it is reserved的解决方法...
- Linux 下的动态链接库问题
- 2008年夜饭时随手拍的两张照片
- matplotlib plt.plot
- uva 1611——Crane
- php源码自动识别文本中的链接,自动加载识别文件Auto.php
- request.cookie[name]的到的过期时间是{0001-1-1 0:00:00}
- log4j的使用 20220228
- What is Leanstar.cn?
- c3p0配置及泄露问题
- 逆向分析CrackMe系列——CrackMe003
- 电池SOC仿真系列-基于遗传算法的电池参数辨识
- c语言位运算负数的实例_负数位运算的右移操作-C语言基础
- Chapter2 ROS通信机制----基础篇(Ⅰ)vs配置及通信基础
- vue-cli、脚手架创建、eslint、alias别名配置、proxy代理配置、axios、scoped、穿透、媒体查询、12栅格、动态rem、1px边框、移动端事件、300ms延迟问题(六)
- Win10系统程序图标上的盾牌怎么去除?
- 计算机组成与系统结构——MIPS多周期处理器-7指令
- 软件项目任务分解的概念
- 一文读懂供应链金融及其衍生产品