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

第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位数据。

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

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

  1. html 打印时隐藏,html 打印相关操作与实现详解

    原理为调用 window.print() 方法,但是该方法只能对当前页面全部打印,所以有了以下方案来解决局部打印 1: 利用 iframe 将需要打印的元素和样式注入 再调用打印 // 示例代码 fu ...

  2. 取消IE7以上版本 打印时缩小字体填充的方法

    IE7及IE7以上版本的浏览器对打印增加 "缩小字体填充 (Shrink-to-fit)"这么一个新功能,就是当你要打印的页面长宽超过打印纸张的大小,浏览器自动调整字体的大小使恰好 ...

  3. C# 使用printDocument1.Print打印时不显示 正在打印对话框(里面还有一个讨厌的取消按钮)...

    C#使用printDocument1.Print打印时不显示正在打印对话框有两种方法 第一种,使用PrintController PrintController printController = n ...

  4. css 隐藏元素 显示元素_使用CSS打印时如何隐藏元素?

    css 隐藏元素 显示元素 Introduction: 介绍: We have come across many challenges while developing a website or we ...

  5. qt的qprinter打印功能怎么设置打印时字体大小_如何打印一份成绩单

    学校考试之后,要看自己班的成绩,要打印自己班的成绩. 需要进行以下操作,设置好后,只打印自己班的那页就可以了. 惯用WPS,本文一些方法可能仅适用WPS.因为EXCEL的打印预览我没有掌握. 一.冻结 ...

  6. CAD图纸打印时如何去掉图纸边框的白边?

    CAD图纸打印时如何去掉图纸边框的白边?打印图纸,预览时发现图形四周有白边,该如何处理呢?其实我们只需要设置图纸边框就可以了,下面来教你具体的操作方法. 1.首先我们运行CAD制图工具,打开需要打印的 ...

  7. python中,print()多个数据逗号分隔,打印时会以空格分隔,如果不要空格可以使用{}占位符

    print()多个数据逗号分隔,打印时会以空格分隔,如果不要空格可以使用{}占位符

  8. 关于打印时怎样不出现打印机选项而直接打印的解决方法

    关于打印时怎样不出现打印机选项而直接打印的解决方法 作者:长江支流 关键字:.NET.打印.打印预览.打印对话框.打印机设置 日 期:2005-12-12 经常很多使用MIS金质打印通的网友来信问打印 ...

  9. 关于excel中一部分表格显示但打印时不打印呢

    转自:微点阅读  https://www.weidianyuedu.com 可以通过"设置打印区域"来实现,下面来介绍2种方法: 一.通过[设置打印区域]来实现 1.选中要打印的区 ...

最新文章

  1. 基于uPC1677C射频功率放大
  2. 【OpenCV3】透视变换——cv::getPerspectiveTransform()与cv::warpPerspective()详解
  3. 手机java程序_郑州北大青鸟:用手机也能编写Java程序代码?
  4. mysql主从1594错误_3分钟解决MySQL主从1594错误
  5. 把握本质规律——《数学之美》作者吴军
  6. 《HTML5和CSS3快速参考》——1.3HTML5的品牌化
  7. [spark]Spark2.4.6用put写入写入Hbase1.3.1
  8. angularJS使用rootscope创建父域和子模态框通用的属性与函数
  9. hdu 2159 FATE
  10. java 使用websocket_Java使用WebSocket
  11. 使用IBM SPSS Statistics常用图表附例演示讲解
  12. 【机器学习基石】概述(一)
  13. 功能安全标准-ISO26262-8---安全分析手段FIA,FMEA,FMEDA
  14. linux opendir路径_Linux下目录文件的操作(opendir,readdir,closedir) 以及DIR,dirent,stat等结构体详解...
  15. Geek卸载,Windows电脑再无卡顿
  16. 今日头条信息流 - 基础账户实操
  17. 《考试脑科学》读后感
  18. 会计未来十年发展趋势_谈未来十年会计行业的发展趋势
  19. 1和new Number(1)的区别
  20. Macos 安装MacTex SublimeText3 Skim环境

热门文章

  1. 2021手游排行前十名分享
  2. k线顶分型 python_K线的顶分型与底分型(实例图解)
  3. TradingView - K线 使用详解
  4. 数值分析——LU分解求解线性方程组的Python实现
  5. android开启照相功能,Android打开系统相机并拍照的2种显示方法
  6. OpenSSL安装使用(二):OpenSSL安装说明
  7. 火山视窗整数数组类增删查改操作
  8. 【从0到1搭建LoRa物联网】20、LoRaWAN扩展
  9. C语言程序设计第二版 甘勇, 李烨 , 卢冰
  10. #1830 : Cheat