%lld,%d,%hd,%hhd在打印时的“潜规则”
先由一道经典例题引入,想必很多学习者都遇到过,
第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在打印时的“潜规则”相关推荐
- html 打印时隐藏,html 打印相关操作与实现详解
原理为调用 window.print() 方法,但是该方法只能对当前页面全部打印,所以有了以下方案来解决局部打印 1: 利用 iframe 将需要打印的元素和样式注入 再调用打印 // 示例代码 fu ...
- 取消IE7以上版本 打印时缩小字体填充的方法
IE7及IE7以上版本的浏览器对打印增加 "缩小字体填充 (Shrink-to-fit)"这么一个新功能,就是当你要打印的页面长宽超过打印纸张的大小,浏览器自动调整字体的大小使恰好 ...
- C# 使用printDocument1.Print打印时不显示 正在打印对话框(里面还有一个讨厌的取消按钮)...
C#使用printDocument1.Print打印时不显示正在打印对话框有两种方法 第一种,使用PrintController PrintController printController = n ...
- css 隐藏元素 显示元素_使用CSS打印时如何隐藏元素?
css 隐藏元素 显示元素 Introduction: 介绍: We have come across many challenges while developing a website or we ...
- qt的qprinter打印功能怎么设置打印时字体大小_如何打印一份成绩单
学校考试之后,要看自己班的成绩,要打印自己班的成绩. 需要进行以下操作,设置好后,只打印自己班的那页就可以了. 惯用WPS,本文一些方法可能仅适用WPS.因为EXCEL的打印预览我没有掌握. 一.冻结 ...
- CAD图纸打印时如何去掉图纸边框的白边?
CAD图纸打印时如何去掉图纸边框的白边?打印图纸,预览时发现图形四周有白边,该如何处理呢?其实我们只需要设置图纸边框就可以了,下面来教你具体的操作方法. 1.首先我们运行CAD制图工具,打开需要打印的 ...
- python中,print()多个数据逗号分隔,打印时会以空格分隔,如果不要空格可以使用{}占位符
print()多个数据逗号分隔,打印时会以空格分隔,如果不要空格可以使用{}占位符
- 关于打印时怎样不出现打印机选项而直接打印的解决方法
关于打印时怎样不出现打印机选项而直接打印的解决方法 作者:长江支流 关键字:.NET.打印.打印预览.打印对话框.打印机设置 日 期:2005-12-12 经常很多使用MIS金质打印通的网友来信问打印 ...
- 关于excel中一部分表格显示但打印时不打印呢
转自:微点阅读 https://www.weidianyuedu.com 可以通过"设置打印区域"来实现,下面来介绍2种方法: 一.通过[设置打印区域]来实现 1.选中要打印的区 ...
最新文章
- 基于uPC1677C射频功率放大
- 【OpenCV3】透视变换——cv::getPerspectiveTransform()与cv::warpPerspective()详解
- 手机java程序_郑州北大青鸟:用手机也能编写Java程序代码?
- mysql主从1594错误_3分钟解决MySQL主从1594错误
- 把握本质规律——《数学之美》作者吴军
- 《HTML5和CSS3快速参考》——1.3HTML5的品牌化
- [spark]Spark2.4.6用put写入写入Hbase1.3.1
- angularJS使用rootscope创建父域和子模态框通用的属性与函数
- hdu 2159 FATE
- java 使用websocket_Java使用WebSocket
- 使用IBM SPSS Statistics常用图表附例演示讲解
- 【机器学习基石】概述(一)
- 功能安全标准-ISO26262-8---安全分析手段FIA,FMEA,FMEDA
- linux opendir路径_Linux下目录文件的操作(opendir,readdir,closedir) 以及DIR,dirent,stat等结构体详解...
- Geek卸载,Windows电脑再无卡顿
- 今日头条信息流 - 基础账户实操
- 《考试脑科学》读后感
- 会计未来十年发展趋势_谈未来十年会计行业的发展趋势
- 1和new Number(1)的区别
- Macos 安装MacTex SublimeText3 Skim环境