%lld,%d,%hd,%hhd在打印时的“潜规则”

2023-10-27

先由一道经典例题引入,想必很多学习者都遇到过,

第2114行的打印结果毫无疑问是1 2 3;     

第2115行的打印结果为1 0 2;因为一般的编译器都是小端存储模式,即数据的低位存储于内存的

低地址中,数据的高位存储于内存的高地址中。前两个%d分别访问a的低32位和高32位,故打印

1,0;第三个%d访问b的低32位,结果打印2。

程序运行结果:

现在进入正题,讨论%hd和%hhd的打印情况;

 按照前面的思路,这里%hd打印2个字节的内容(访问16位),结果应该为:1 0 0;

程序运行结果:

 结果还是1 0 2,和%d打印结果一样,似乎访问的仍然是四个字节的空间,现做如下实验来验证这

一假设;

赋值a,让其第1和第33位为1,其余位上全部为0,如果猜想正确,则输出应该为 :1  1 2;

 继续换%hhd试验:

        由上可知,%d,%hd和%hhd在打印long long类型时,将其内存中的补码分成了连续的“4个字节(32位)的单元”,每次访问四个字节(32)

但是下面的这个情况可能会让你感到迷惑:

               

按照前面的结论 ,%hd和%hhd每次访问四个字节,那下面的两个结果也应该是:65536 65536 2才对;于是猜想:将打印的数据类型在内存中的补码分成“连续的四个字节(32位)的单元”后,不同之处在于%d 和(%hd和%hhd)读取数据的有效位不同;由上面结果我们猜测,%hd和%hhd只读取两个字节(低16位)的内容。

再次验证:

       将两个32位的低16位的最高位赋值1,如果%hd和%hhd读取的有效位为16位,则第16位为符号位,打印出来的数应该位负数;上述程序运行结果的确为负数,所以猜想成立。(实际上补码1000000000000000为short短整型数据的最小值-2^15=-32768在内存中的存储数据)

总结:%d,%hd,%hhd在打印long long类型数据时,将其划分为连续的“四个字节的单元(32位)”,且%d读取整个32位,%hd和%hhd读取低16位;

下面继续讨论打印int,short,char类型数据;

2,3均被打印出来了,证明,此情况下 %hd和%hhd仍是遵循访问“四个字节的单元(32位)”这一结论,且两个-32768说明%hd和%hhd打印时,读取的仍是低16位(最高位为符号位),至此前面的结论没有问题。

下面为打印short和char型数据的情况

        打印结果均为1 2 3;那连续访问“四个字节的单元(32位)”还是否成立呢,显然是成立的,实际上此时short类型数据会整型提升为int型数据,高位补符号位。严格一点,现在还需要讨论%hhd打印时读取的有效位问题;

       第一个输出结果均为负值,说明%hhd打印short数据时读取的最高位也是16位,因为整型提升补符号位;因此前面的结论仍然成立。

同理,打印char

 此情况下时,每次打印都发生整体提升,高位补符号位,结论还是成立。

总结:%d,%hd和%hhd在打印时,将其对应的数据在内存中的补码分成了连续的“4个字节的单元”,大于四个字节的类型进化“切割”,小于四个字节的类型发生整体提升,每次访问四个字节,但是%d读取全部32位,%hd和%hhd读取32位的低16位数据。

浮点数不在本次讨论范围。

     

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

%lld,%d,%hd,%hhd在打印时的“潜规则” 的相关文章

随机推荐

  • 2、ubuntu18.04安装cmake

    本文以安装cmake3 18 0为例 1 获取安装包 wget https cmake org files v3 18 cmake 3 18 0 Linux x86 64 tar gz 2 解压压缩包 tar zxvf cmake 3 18
  • GD32F3x0 USB CDC应用案例

    GD32F3x0 USB CDC应用 本文有点长 描述了从0开始移植驱动到应用的过程和思路 准备工作 因项目需求这两天需要做个USB的虚拟COM口发卡器 实现双向通讯 由于功能较为简单我们选择GD32F350来开发 先跑跑官方例程 GD32
  • 分享程序员在囧途网站

    不知不觉的在博客园看到了失业的程序员系列文章 我就带着好奇的看了几章 然后发现类似创业的文章的经历的文章 都是程序员爱看到的文章 同时把这样的经历加上一点修饰 是很多程序员喜欢的话题 也是程序员想看到的文章 不知道不觉到了第六章的时候 文章
  • LayUI数据表格 通用工具栏 分页+搜索+排序

    完成效果 1 接收和展示后端接口传来的数据 2 分页和跳页 设置每页的数量 3 工具栏 查看 修改 删除 4 工具栏 筛选列 导出Excel 打印 5 搜索功能 6 后端排序功能 本实例只展示了实现功能的必须代码 后端代码的非必须部分未贴出
  • 第十三届蓝桥杯 ——刷题统计

    题目描述 小明决定从下周一开始努力刷题准备蓝桥杯竞赛 他计划周一至周五每天做 a a a 道题目 周六和周日每天做 b b b 道题目 请你帮小明计算 按照计划他将在第几天实现做题数大于等于
  • 【C++】 STL库list容器

    STL库list容器 1 list中的构造函数 2 begin 和end list 容器的iterator 3 增 3 1 push back 末端插入 3 2 push front 头部插入 3 3 insert 在指定位置插入n个元素
  • android:checkBox的监听

    CheckBox cb project CheckBox findViewById R id cb project cb project setText 测试是否被选中 cb project setOnCheckedChangeListen
  • [源码和文档分享]基于Keras和tensorflow深度学习Python实现的支持人脸识别和情绪分类的社区APP网站和微信小程序...

    1 项目介绍 1 1 背景 视觉使人类得以感知和理解周边的世界 人的大脑皮层大约有 70 的活动在处理 视觉相关信息 计算机视觉即通过电子化的方式来感知和理解影像 以达到甚至超 越人类视觉智能的效果 从 1966 年学科建立 MIT The
  • Xtrabackup实现数据的备份与恢复

    目录 Xtrabackup实现数据的备份与恢复 Xtrabackup介绍 Xtrabackup优点 Xtrabackup备份原理 Xtrabackup增量备份介绍 Xtrabackup安装 创建测试数据 Xtrabackup全量备份与恢复
  • 14.【Linux】如何在ubuntu18.04下安装Firefox中国版解决Ubuntu与Windows下Firefox账号同步问题(已解决)

    一 下载最新版本火狐Linux版 下载地址 http firefox com cn download 选择火狐Linux64 bit版 下载后文件为 Firefox latest x86 64 tar bz2 二 首先卸载自带的国际版火狐浏
  • 华为-判断两个IP是否属于同一子网

    java实现 问题 题目描述 子网掩码是用来判断任意两台计算机的IP地址是否属于同一子网络的根据 子网掩码与IP地址结构相同 是32位二进制数 其中网络号部分全为 1 和主机号部分全为 0 利用子网掩码可以判断两台主机是否中同一子网中 若两
  • VMware虚拟机怎么用U盘装win7系统

    VMware Workstation虚拟机可以在一台电脑上模拟运行多种不同的操作系统 实现与实际电脑完全一样的操作 包括读取U盘 连接网络等 很多用户想用U盘启动盘给VMware安装win7系统 但是不知道怎么操作 本文系统城小编就教大家在
  • Unity 手机触屏事件

    Unity 触屏操作 当将Unity游戏运行到IOS或Android设备上时 桌面系统的鼠标左键可以自动变为手机屏幕上的触屏操作 但如多点触屏等操作却是无法利用鼠标操作进行的 Unity的Input类中不仅包含桌面系统的各种输入功能 也包含
  • Java实现冒泡排序

    冒泡排序 基础版本 冒泡 两轮循环 外层表示第几轮冒泡 内层表示两两比较 public static void bubble int a 冒泡轮次 for int j 0 j lt a length 1 j 两两比较 for int i 0
  • 文件写入操作编程(Linux系统编程)

    write函数 man手册的相关介绍 代码实现 include
  • 苹果xsmax登录id服务器无响应,iPhone XS Max无法开机了这几招轻松解决!

    原标题 iPhone XS Max无法开机了这几招轻松解决 iPhone手机使用久了难免会出现卡顿 卡机的现象 如果设备屏幕死机 手机触摸屏不灵或者设备在开机时卡住 该怎么办 下面 整理了一些关于iPhoneXSMax手机无法开机的解决方法
  • 2021年华中杯数学建模挑战赛A题马赛克瓷砖选色问题求解全过程文档及程序

    2021年华中杯数学建模 A题 马赛克瓷砖选色问题 原题再现 马赛克瓷砖是一种尺寸较小 常见规格为边长不超过 5cm 的正方形瓷砖 便于在非平整的表面铺设 并且容易拼接组合出各种文字或图案 但是受工艺和成本的限制 瓷砖的颜色只能是有限的几种
  • Sublime Text 3常用插件及安装方法

    Sublime Text 3常用插件及安装方法 相关教程 sublime text 3 快捷键大全以及配置编译环境 安装Sublime Text 3插件的方法 直接安装 安装Sublime text 2插件很方便 可以直接下载安装包解压缩到
  • 三菱服务器显示d01,三菱井道故障显示代码是什么?

    9 井道 91F上行UL开关动作 91E下行DL开关动作91DUL DL都动作917后门RLD OFF故障 916后门RLU OFF故障 915前门RLD OFF故障 914前门RLU OFF故障913 TSD开关故障 93F UL DL都
  • %lld,%d,%hd,%hhd在打印时的“潜规则”

    先由一道经典例题引入 想必很多学习者都遇到过 第2114行的打印结果毫无疑问是1 2 3 第2115行的打印结果为1 0 2 因为一般的编译器都是小端存储模式 即数据的低位存储于内存的 低地址中 数据的高位存储于内存的高地址中 前两个 d分