文章目录

问题概述

这个错是刚学c语言的时候碰到的,突然好想我的c语言老师,所以在此记录一下。

#include<stdio.h>
void main(){
unsigned short a=0x1000,debug,bug;
bug=a<<4>>4;
debug=a<<4;
debug=debug>>4;
printf("%x %x\n%d %d",bug,debug,sizeof(bug),sizeof(debug));
}

这里的运行结果是1000 0 2 2。因为我只截取了这一个突出问题,所以结果比较明显。
我希望得到的结果是0,但是如果直接往左移再往右移,由于整型提升[1],在运算过程中实际使用的是int类型,所以得到的结果是1000。
最高位数字只是在它能去的地方走了一趟,然后又回到原点,什么也没改。

[1]整型提升是C程序设计语言中的一项规定:在表达式计算时,各种整形首先要提升为int类型,如果int类型不足以表示则要提升为unsigned int类型;然后执行表达式的运算。

如果拆开赋值,在赋值过程中,4字节赋值给2字节的变量,得到的自然是2字节的值,所以并没有出错,符合预期,得到结果为0。

应用

循环位移类题目时可能会被坑。
如果想通过左移之后右移的方式把高位弄没,对于unsigned short变量,不能直接z=x<<4>>4,而应该分开写成z=x<<4,z=z>>4。

怀旧

当时对整型提升只是个模模糊糊的概念,误以为是栽在了内存溢出啊、强制类型转换啊之类的听起来高大上的坑上。于是鼓起勇气,跑讲台上问老师——这是俺大学第一次问老师题目~
因为问题表面有点扭曲,一开始老师也没找到问题根源嘿嘿嘿。因为这个问题是整型提升的典型,还特意在班上讲到了~(超高兴)
老师人超级好。这是大学第一个能认出我的老师~c语言只学一学期,太可惜了,以后找机会还选他的课(虽然卷子出得挺难)(期末没考好好难过,感觉愧对信任orz)

【BUG】C语言|左移之后,最高位的数字还在吗?(整型提升)的更多相关文章

  1. 零基础如何学好Python 之int 数字整型类型 定义int()范围大小转换

    本文主题是讲python数字类型python int整型使用方法及技巧.它是不可变数据类型中的一种,它的一些性质和字符串是一样的,注意是整型不是整形哦. Python int有多种数字类型:整型int ...

  2. [c语言]左移和右移

    左移和右移都是位运算的概念.我们知道计算机是基于二进制保存数据的,因此左移和右移的概念十分重要.本文约定是32位的机器. [左移] 丢弃最高位,0补最低位 左移是把一个数按照二进制每位向左移动若干位, ...

  3. 计算机二级-C语言-字符数字转化为整型数字。形参与实参类型相一致。double类型的使用。

    //函数fun功能:将a和b所指的两个字符串分别转化成面值相同的整数,并进行相加作为函数值返回,规定只含有9个以下数字字符. //重难点:字符数字转化为整型数字. #include <stdio ...

  4. __c语言__整型、实型的存储(十进制转二进制)

    float 和 double 类型数据在内存中的存储方法 无符号整型采用32位编码,带符号整型数采用1个符号位31位底数编码: 单精度数据采用了1位符号位,8位阶码,23位尾数的编码: 双精度数据采用 ...

  5. [日常] Go语言圣经--作用域,基础数据类型,整型

    go语言圣经-作用域 1.一个声明语句将程序中的实体和一个名字关联,比如一个函数或一个变量 2.一个变量的生命周期是指程序运行时变量存在的有效时间段;声明语句的作用域对应的是一个源代码的文本区域,它是 ...

  6. 【C语言】整型在内存中的存储

    整型在内存中的存储 1.整型的归类 char short int long 以上都分为有符号(signed)与无符号(unsigned)的类型 2.原码.反码和补码 2.1 定义 计算机在表示一个数字 ...

  7. C语言---整型字符串转换

    C语言提供了几个标准库函数,能够将随意类型(整型.长整型.浮点型等)的数字转换为字符串.下面是用itoa()函数将整数转 换为字符串的一个样例: # include <stdio.h>   ...

  8. C语言的整型溢出问题

    整型溢出有点老生常谈了,bla, bla, bla… 但似乎没有引起多少人的重视.整型溢出会有可能导致缓冲区溢出,缓冲区溢出会导致各种黑客攻击,比如最近OpenSSL的heartbleed事件,就是一 ...

  9. 整型转字符串(convert int to char)优化实践——一个意外的BUG

    convert_int_to_char函数在使用时出现过一个BUG. 当使用值是13200020099时,返回的字符串是"13200020111",结果是错误的. 在gcc编译器里 ...

  10. Docs-.NET-C#-指南-语言参考-关键字-内置类型-值类型:整型数值类型

    ylbtech-Docs-.NET-C#-指南-语言参考-关键字-内置类型-值类型:整型数值类型 1.返回顶部 1. 整型数值类型(C# 参考) 2019/10/22 “整型数值类型”是“简单类型”的 ...

随机推荐

  1. Vue3 数据响应式原理与高效数据操作全解析

    一.Vue3 数据响应式原理 (一)Proxy 替代 Object.defineProperty 在 Vue2 中,数据响应式是通过 Object.defineProperty 实现的.这种方法虽然能 ...

  2. TOGAF 内容元模型综合指南

    介绍 开放群组架构框架 (TOGAF) 是一种广泛使用的企业架构框架,它提供了一种结构化的方法来设计.规划.实施和管理企业信息技术架构.TOGAF 内容元模型是该框架的重要组成部分,它提供了一种标准化 ...

  3. 怎么证明二元函数的极限是多少?& 怎么证明二元函数的极限不存在?

    怎么证明二元函数的极限是多少:https://zhaokaifeng.com/16589/ 怎么证明二元函数的极限不存在:https://zhaokaifeng.com/16600/

  4. 傻妞教程——对接使用redis储存,更快的读写速度

    Redis的特点 1.Redis支持数据的持久化,可以将内存中的数据保存在磁盘中. 2.Redis数据读写速度非常快,因为它把数据都读取到内存当中操作. 3.Redis支持数据的备份,即master- ...

  5. 百万架构师第四十三课:Nginx:Nginx 应用实战|JavaGuide

    百万架构师系列文章阅读体验感更佳 原文链接:https://javaguide.net 公众号:不止极客 课程目标: Nginx 反向代理功能配置 Nginx 负载均衡实战 Nginx 动静分离配置 ...

  6. 初探PApplet窗口打开方式(Processing程序)

    使用Processing快6年了,是时候回过头来看看它的"main"方法了,也就是它从哪出生的?~~~ 源码学习 ///////////////////////////////// ...

  7. 百万架构师第四十五课:并发编程的基础|JavaGuide

    课程目标 1. 多线程的发展历史 2. 线程的应用 3. 并发编程的基础 4. 线程安全的问题 特定的指令,计算机不会存储指令,把指令写下来,一次性读取指令,批处理. 然后我们需要把批处理进行隔离.保 ...

  8. 【日常运维笔记】linux系统使用grep命令查找文件,并用vim编辑文件

    问题描述:linux系统中查找含有某个字符的文件,进行编辑修改 1.使用grep命令查找到符合条件的文件 命令格式:grep  '匹配内容'  文件路径  显示方式(-r  -n) -i:忽略大小写进 ...

  9. 使用电阻网络实现的vga驱动电路,fpga驱动vga显示器验证,代替gm7123芯片

    之前驱动vga,要么是直接使用fpga管脚直接驱动,颜色为8原色 使用线缆 vs,hs,r,g,b一共五根线,三原色要么是0要么是1,所以色彩最多8种,rgb组合 若要实现真彩色驱动,如rgb888, ...

  10. Keil中设置显示空白符,并将Tab键使用4个空格代替

    前言 Keil 的默认设置是没有将 Tab 键使用空格代替的,不同的文本编辑器对 Tab 键所占的空格数不同,有占 2 个空格的,也有占 4 个空格的,这就导致同样的代码在不同的编辑器中缩进不同,虽不 ...