重生之我在异世界学编程之C语言:数据在内存中的存储篇(上)
大家好,这里是小编的博客频道
小编的博客:就爱学编程
很高兴在
CSDN
这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!!
目录
- 引言
- 正文
- 快乐的时光总是短暂,咱们下篇博文再见啦!!!不要忘了,给小编点点赞和收藏支持一下,在此非常感谢!!!
引言
本文主要讲述了数据在内存中的存储位置,存储方法以及如何读取内存中的数据。如果你对其有困惑,不妨好好阅读,也许会有新的体会和感悟。
那接下来就让我们开始遨游在知识的海洋!
正文
一、数据类型介绍
1.内置类型
整型家族
#mermaid-svg-fMJRNrQEYVkyaksp {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-fMJRNrQEYVkyaksp .error-icon{fill:#552222;}#mermaid-svg-fMJRNrQEYVkyaksp .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-fMJRNrQEYVkyaksp .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-fMJRNrQEYVkyaksp .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-fMJRNrQEYVkyaksp .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-fMJRNrQEYVkyaksp .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-fMJRNrQEYVkyaksp .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-fMJRNrQEYVkyaksp .marker{fill:#333333;stroke:#333333;}#mermaid-svg-fMJRNrQEYVkyaksp .marker.cross{stroke:#333333;}#mermaid-svg-fMJRNrQEYVkyaksp svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-fMJRNrQEYVkyaksp .label{font-family:\"trebuchet ms\",verdana,arial,sans-serif;color:#333;}#mermaid-svg-fMJRNrQEYVkyaksp .cluster-label text{fill:#333;}#mermaid-svg-fMJRNrQEYVkyaksp .cluster-label span{color:#333;}#mermaid-svg-fMJRNrQEYVkyaksp .label text,#mermaid-svg-fMJRNrQEYVkyaksp span{fill:#333;color:#333;}#mermaid-svg-fMJRNrQEYVkyaksp .node rect,#mermaid-svg-fMJRNrQEYVkyaksp .node circle,#mermaid-svg-fMJRNrQEYVkyaksp .node ellipse,#mermaid-svg-fMJRNrQEYVkyaksp .node polygon,#mermaid-svg-fMJRNrQEYVkyaksp .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-fMJRNrQEYVkyaksp .node .label{text-align:center;}#mermaid-svg-fMJRNrQEYVkyaksp .node.clickable{cursor:pointer;}#mermaid-svg-fMJRNrQEYVkyaksp .arrowheadPath{fill:#333333;}#mermaid-svg-fMJRNrQEYVkyaksp .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-fMJRNrQEYVkyaksp .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-fMJRNrQEYVkyaksp .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-fMJRNrQEYVkyaksp .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-fMJRNrQEYVkyaksp .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-fMJRNrQEYVkyaksp .cluster text{fill:#333;}#mermaid-svg-fMJRNrQEYVkyaksp .cluster span{color:#333;}#mermaid-svg-fMJRNrQEYVkyaksp div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-fMJRNrQEYVkyaksp :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;} 家族成员 int char unsigned.int short.int long.long unsigned.short signed.short unsigned.long.long signed.long.long signed.int unsigned.char signed.char
疑惑点:为什么char类型属于整型家族?
解释:这是因为char类型的数据在存储的时候,是以它的ASCLL值进行存储的,本质是一个整型。
浮点型家族
#mermaid-svg-pROphVcLIDvPFVIw {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-pROphVcLIDvPFVIw .error-icon{fill:#552222;}#mermaid-svg-pROphVcLIDvPFVIw .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-pROphVcLIDvPFVIw .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-pROphVcLIDvPFVIw .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-pROphVcLIDvPFVIw .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-pROphVcLIDvPFVIw .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-pROphVcLIDvPFVIw .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-pROphVcLIDvPFVIw .marker{fill:#333333;stroke:#333333;}#mermaid-svg-pROphVcLIDvPFVIw .marker.cross{stroke:#333333;}#mermaid-svg-pROphVcLIDvPFVIw svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-pROphVcLIDvPFVIw .label{font-family:\"trebuchet ms\",verdana,arial,sans-serif;color:#333;}#mermaid-svg-pROphVcLIDvPFVIw .cluster-label text{fill:#333;}#mermaid-svg-pROphVcLIDvPFVIw .cluster-label span{color:#333;}#mermaid-svg-pROphVcLIDvPFVIw .label text,#mermaid-svg-pROphVcLIDvPFVIw span{fill:#333;color:#333;}#mermaid-svg-pROphVcLIDvPFVIw .node rect,#mermaid-svg-pROphVcLIDvPFVIw .node circle,#mermaid-svg-pROphVcLIDvPFVIw .node ellipse,#mermaid-svg-pROphVcLIDvPFVIw .node polygon,#mermaid-svg-pROphVcLIDvPFVIw .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-pROphVcLIDvPFVIw .node .label{text-align:center;}#mermaid-svg-pROphVcLIDvPFVIw .node.clickable{cursor:pointer;}#mermaid-svg-pROphVcLIDvPFVIw .arrowheadPath{fill:#333333;}#mermaid-svg-pROphVcLIDvPFVIw .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-pROphVcLIDvPFVIw .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-pROphVcLIDvPFVIw .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-pROphVcLIDvPFVIw .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-pROphVcLIDvPFVIw .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-pROphVcLIDvPFVIw .cluster text{fill:#333;}#mermaid-svg-pROphVcLIDvPFVIw .cluster span{color:#333;}#mermaid-svg-pROphVcLIDvPFVIw div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-pROphVcLIDvPFVIw :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;} 家族成员 float double
注意:浮点型都是有符号的。
2.自定义类型
#mermaid-svg-mhXCmKMQcifwaVGY {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-mhXCmKMQcifwaVGY .error-icon{fill:#552222;}#mermaid-svg-mhXCmKMQcifwaVGY .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-mhXCmKMQcifwaVGY .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-mhXCmKMQcifwaVGY .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-mhXCmKMQcifwaVGY .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-mhXCmKMQcifwaVGY .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-mhXCmKMQcifwaVGY .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-mhXCmKMQcifwaVGY .marker{fill:#333333;stroke:#333333;}#mermaid-svg-mhXCmKMQcifwaVGY .marker.cross{stroke:#333333;}#mermaid-svg-mhXCmKMQcifwaVGY svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-mhXCmKMQcifwaVGY .label{font-family:\"trebuchet ms\",verdana,arial,sans-serif;color:#333;}#mermaid-svg-mhXCmKMQcifwaVGY .cluster-label text{fill:#333;}#mermaid-svg-mhXCmKMQcifwaVGY .cluster-label span{color:#333;}#mermaid-svg-mhXCmKMQcifwaVGY .label text,#mermaid-svg-mhXCmKMQcifwaVGY span{fill:#333;color:#333;}#mermaid-svg-mhXCmKMQcifwaVGY .node rect,#mermaid-svg-mhXCmKMQcifwaVGY .node circle,#mermaid-svg-mhXCmKMQcifwaVGY .node ellipse,#mermaid-svg-mhXCmKMQcifwaVGY .node polygon,#mermaid-svg-mhXCmKMQcifwaVGY .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-mhXCmKMQcifwaVGY .node .label{text-align:center;}#mermaid-svg-mhXCmKMQcifwaVGY .node.clickable{cursor:pointer;}#mermaid-svg-mhXCmKMQcifwaVGY .arrowheadPath{fill:#333333;}#mermaid-svg-mhXCmKMQcifwaVGY .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-mhXCmKMQcifwaVGY .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-mhXCmKMQcifwaVGY .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-mhXCmKMQcifwaVGY .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-mhXCmKMQcifwaVGY .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-mhXCmKMQcifwaVGY .cluster text{fill:#333;}#mermaid-svg-mhXCmKMQcifwaVGY .cluster span{color:#333;}#mermaid-svg-mhXCmKMQcifwaVGY div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-mhXCmKMQcifwaVGY :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;} 组成 数组 结构体.struct 枚举.enum 联合体.union
3.指针类型
#mermaid-svg-pbMJuNogQpG1xZZy {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-pbMJuNogQpG1xZZy .error-icon{fill:#552222;}#mermaid-svg-pbMJuNogQpG1xZZy .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-pbMJuNogQpG1xZZy .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-pbMJuNogQpG1xZZy .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-pbMJuNogQpG1xZZy .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-pbMJuNogQpG1xZZy .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-pbMJuNogQpG1xZZy .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-pbMJuNogQpG1xZZy .marker{fill:#333333;stroke:#333333;}#mermaid-svg-pbMJuNogQpG1xZZy .marker.cross{stroke:#333333;}#mermaid-svg-pbMJuNogQpG1xZZy svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-pbMJuNogQpG1xZZy .label{font-family:\"trebuchet ms\",verdana,arial,sans-serif;color:#333;}#mermaid-svg-pbMJuNogQpG1xZZy .cluster-label text{fill:#333;}#mermaid-svg-pbMJuNogQpG1xZZy .cluster-label span{color:#333;}#mermaid-svg-pbMJuNogQpG1xZZy .label text,#mermaid-svg-pbMJuNogQpG1xZZy span{fill:#333;color:#333;}#mermaid-svg-pbMJuNogQpG1xZZy .node rect,#mermaid-svg-pbMJuNogQpG1xZZy .node circle,#mermaid-svg-pbMJuNogQpG1xZZy .node ellipse,#mermaid-svg-pbMJuNogQpG1xZZy .node polygon,#mermaid-svg-pbMJuNogQpG1xZZy .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-pbMJuNogQpG1xZZy .node .label{text-align:center;}#mermaid-svg-pbMJuNogQpG1xZZy .node.clickable{cursor:pointer;}#mermaid-svg-pbMJuNogQpG1xZZy .arrowheadPath{fill:#333333;}#mermaid-svg-pbMJuNogQpG1xZZy .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-pbMJuNogQpG1xZZy .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-pbMJuNogQpG1xZZy .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-pbMJuNogQpG1xZZy .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-pbMJuNogQpG1xZZy .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-pbMJuNogQpG1xZZy .cluster text{fill:#333;}#mermaid-svg-pbMJuNogQpG1xZZy .cluster span{color:#333;}#mermaid-svg-pbMJuNogQpG1xZZy div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-pbMJuNogQpG1xZZy :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;} 组成 一级指针 用来存放内置数据类型变量的地址 二级指针 用来存放一级指针变量的地址
4.空类型(void)
常用于表示函数不需要参数
例:
#includeint main(void) {printf(\"hello,world!\");return 0;}
运行结果:
当然,这常适用于非主函数。
二、数据在内存中的存储规则
符号位:对于一个有符号的的数来说,最高位就是符号位,c语言中规定1表示负,0表示正。
1.整型数据在内存中的存储
原码 、反码 、补码
原码
把一个十进制数直接转化为它的二进制,就是这个数的原码。
反码
正数:还是原码
负数:符号位不变,其他位按位取反
补码
正数:还是原码
负数:反码+1
#mermaid-svg-ud0O88XWl8y78O3J {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-ud0O88XWl8y78O3J .error-icon{fill:#552222;}#mermaid-svg-ud0O88XWl8y78O3J .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ud0O88XWl8y78O3J .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-ud0O88XWl8y78O3J .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ud0O88XWl8y78O3J .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ud0O88XWl8y78O3J .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ud0O88XWl8y78O3J .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ud0O88XWl8y78O3J .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ud0O88XWl8y78O3J .marker.cross{stroke:#333333;}#mermaid-svg-ud0O88XWl8y78O3J svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ud0O88XWl8y78O3J .label{font-family:\"trebuchet ms\",verdana,arial,sans-serif;color:#333;}#mermaid-svg-ud0O88XWl8y78O3J .cluster-label text{fill:#333;}#mermaid-svg-ud0O88XWl8y78O3J .cluster-label span{color:#333;}#mermaid-svg-ud0O88XWl8y78O3J .label text,#mermaid-svg-ud0O88XWl8y78O3J span{fill:#333;color:#333;}#mermaid-svg-ud0O88XWl8y78O3J .node rect,#mermaid-svg-ud0O88XWl8y78O3J .node circle,#mermaid-svg-ud0O88XWl8y78O3J .node ellipse,#mermaid-svg-ud0O88XWl8y78O3J .node polygon,#mermaid-svg-ud0O88XWl8y78O3J .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ud0O88XWl8y78O3J .node .label{text-align:center;}#mermaid-svg-ud0O88XWl8y78O3J .node.clickable{cursor:pointer;}#mermaid-svg-ud0O88XWl8y78O3J .arrowheadPath{fill:#333333;}#mermaid-svg-ud0O88XWl8y78O3J .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-ud0O88XWl8y78O3J .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-ud0O88XWl8y78O3J .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-ud0O88XWl8y78O3J .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-ud0O88XWl8y78O3J .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-ud0O88XWl8y78O3J .cluster text{fill:#333;}#mermaid-svg-ud0O88XWl8y78O3J .cluster span{color:#333;}#mermaid-svg-ud0O88XWl8y78O3J div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-ud0O88XWl8y78O3J :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;} signed.int 负数.十进制 原码.二进制 符号位不变,其他位按位取反 反码 加1 补码 正数.十进制
我们要注意:
- 对于有符号整型数据:只有屏幕上打印的是原码,而在内存中进行存储和表示的都是补码。
为什么?
凭什么这么说?我们可以用一个简单的例子佐证我们的说法
例:
- 写一个代码打印-1+1的结果
代码:
#includeint main() {printf(\"%d\", -1 + 1);return 0;}
运行结果:
所以通过这个例子,我们就不难发现:
- 对于整型数据来说,只有屏幕上打印的是原码,而在内存中进行存储和表示的都是补码的智慧和原因。
2.整型数据的运算与打印
但是,掌握了以上的知识点之后,我们其实还并不能完全预见和理解整型数据运算屏幕上打印的结果,还得掌握一些占位符的作用,整型提升,数据截断,数据范围:
(1)占位符
例:
#includeint main() {int a = 2147483647;int b = 1;printf(\"%d %u\", a + b, a + b);return 0;}
运行结果:
思考:为什么同样是a + b,打印的结果确一正一负呢?
- 这里其实涉及了后文要讲的数据范围,但我们通过这个例子依旧是能够感受到占位符不同所带来的不同打印结果,该题我们在后文再进一步剖析。
(2)数据范围
我们知道:
1.每个数据类型都有其对应的字节长度,1字节 == 8bit 位
详见:
那这些bit位是用来干嘛的呢?
2.实际上,这些bit位就是用来存放数字1或0来表示数据大小的。由此我们可以想到:那既然表示数据大小的位数是有限的,那每个类型的数据大小也应该是在一个范围内的。
详见:
注:有负号的为有符号数据类型数据的范围
那如果一个数据超过了其范围,怎么计算?
我们可以用圆环的思想去考虑:
- 每一个无符号的数据类型从大到小都是bit位全0–>bit位全1,而到了最大的时候,也就是bit位全1,再加1就会发生数据越位,所有bit位变成全0,然后再由bit全0–>bit位全1,构成了一个头尾相交的圆环。
以unsigned char为例:
#mermaid-svg-oYhSwS12KI6l4xnD {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-oYhSwS12KI6l4xnD .error-icon{fill:#552222;}#mermaid-svg-oYhSwS12KI6l4xnD .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-oYhSwS12KI6l4xnD .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-oYhSwS12KI6l4xnD .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-oYhSwS12KI6l4xnD .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-oYhSwS12KI6l4xnD .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-oYhSwS12KI6l4xnD .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-oYhSwS12KI6l4xnD .marker{fill:#333333;stroke:#333333;}#mermaid-svg-oYhSwS12KI6l4xnD .marker.cross{stroke:#333333;}#mermaid-svg-oYhSwS12KI6l4xnD svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-oYhSwS12KI6l4xnD .label{font-family:\"trebuchet ms\",verdana,arial,sans-serif;color:#333;}#mermaid-svg-oYhSwS12KI6l4xnD .cluster-label text{fill:#333;}#mermaid-svg-oYhSwS12KI6l4xnD .cluster-label span{color:#333;}#mermaid-svg-oYhSwS12KI6l4xnD .label text,#mermaid-svg-oYhSwS12KI6l4xnD span{fill:#333;color:#333;}#mermaid-svg-oYhSwS12KI6l4xnD .node rect,#mermaid-svg-oYhSwS12KI6l4xnD .node circle,#mermaid-svg-oYhSwS12KI6l4xnD .node ellipse,#mermaid-svg-oYhSwS12KI6l4xnD .node polygon,#mermaid-svg-oYhSwS12KI6l4xnD .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-oYhSwS12KI6l4xnD .node .label{text-align:center;}#mermaid-svg-oYhSwS12KI6l4xnD .node.clickable{cursor:pointer;}#mermaid-svg-oYhSwS12KI6l4xnD .arrowheadPath{fill:#333333;}#mermaid-svg-oYhSwS12KI6l4xnD .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-oYhSwS12KI6l4xnD .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-oYhSwS12KI6l4xnD .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-oYhSwS12KI6l4xnD .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-oYhSwS12KI6l4xnD .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-oYhSwS12KI6l4xnD .cluster text{fill:#333;}#mermaid-svg-oYhSwS12KI6l4xnD .cluster span{color:#333;}#mermaid-svg-oYhSwS12KI6l4xnD div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-oYhSwS12KI6l4xnD :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;} 11111100 11111111 00000000
等价于:
#mermaid-svg-HKtbTg3CrxrZ6z3p {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-HKtbTg3CrxrZ6z3p .error-icon{fill:#552222;}#mermaid-svg-HKtbTg3CrxrZ6z3p .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-HKtbTg3CrxrZ6z3p .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-HKtbTg3CrxrZ6z3p .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-HKtbTg3CrxrZ6z3p .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-HKtbTg3CrxrZ6z3p .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-HKtbTg3CrxrZ6z3p .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-HKtbTg3CrxrZ6z3p .marker{fill:#333333;stroke:#333333;}#mermaid-svg-HKtbTg3CrxrZ6z3p .marker.cross{stroke:#333333;}#mermaid-svg-HKtbTg3CrxrZ6z3p svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-HKtbTg3CrxrZ6z3p .label{font-family:\"trebuchet ms\",verdana,arial,sans-serif;color:#333;}#mermaid-svg-HKtbTg3CrxrZ6z3p .cluster-label text{fill:#333;}#mermaid-svg-HKtbTg3CrxrZ6z3p .cluster-label span{color:#333;}#mermaid-svg-HKtbTg3CrxrZ6z3p .label text,#mermaid-svg-HKtbTg3CrxrZ6z3p span{fill:#333;color:#333;}#mermaid-svg-HKtbTg3CrxrZ6z3p .node rect,#mermaid-svg-HKtbTg3CrxrZ6z3p .node circle,#mermaid-svg-HKtbTg3CrxrZ6z3p .node ellipse,#mermaid-svg-HKtbTg3CrxrZ6z3p .node polygon,#mermaid-svg-HKtbTg3CrxrZ6z3p .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-HKtbTg3CrxrZ6z3p .node .label{text-align:center;}#mermaid-svg-HKtbTg3CrxrZ6z3p .node.clickable{cursor:pointer;}#mermaid-svg-HKtbTg3CrxrZ6z3p .arrowheadPath{fill:#333333;}#mermaid-svg-HKtbTg3CrxrZ6z3p .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-HKtbTg3CrxrZ6z3p .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-HKtbTg3CrxrZ6z3p .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-HKtbTg3CrxrZ6z3p .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-HKtbTg3CrxrZ6z3p .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-HKtbTg3CrxrZ6z3p .cluster text{fill:#333;}#mermaid-svg-HKtbTg3CrxrZ6z3p .cluster span{color:#333;}#mermaid-svg-HKtbTg3CrxrZ6z3p div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-HKtbTg3CrxrZ6z3p :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;} 12 225 0
而每一个符号的数据类型从大到小都是bit位全0–>bit位除了首位全1,而到了最大的时候,也就是bit位除了首位全1,再加1就会变成bit位除了首位全0,然后再变成bit位全1,再加1就会发生数据越位,所有bit位变成全0,然后再由bit全0–>bit位全1,构成了一个头尾相交的圆环。
但是和无符号数据类型不同的是:
- 有符号的数它的二进制位比无符号的数少了一位数值位,并且我们规定1000…0000000表示的是最小的负数。
但我们应注意:
- 二进制数存储和表示无论是正数还是负数都是采用补码的方式,而只是因为我们把无符号数据看做正数,原码和补码一样,且多了一位数值位才导致了表示和存储方式看起来不同,实际都是一样用补码的形式进行存储和表示。
以signed char为例:
#mermaid-svg-PxFcryVbzrVGbyDB {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-PxFcryVbzrVGbyDB .error-icon{fill:#552222;}#mermaid-svg-PxFcryVbzrVGbyDB .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-PxFcryVbzrVGbyDB .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-PxFcryVbzrVGbyDB .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-PxFcryVbzrVGbyDB .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-PxFcryVbzrVGbyDB .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-PxFcryVbzrVGbyDB .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-PxFcryVbzrVGbyDB .marker{fill:#333333;stroke:#333333;}#mermaid-svg-PxFcryVbzrVGbyDB .marker.cross{stroke:#333333;}#mermaid-svg-PxFcryVbzrVGbyDB svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-PxFcryVbzrVGbyDB .label{font-family:\"trebuchet ms\",verdana,arial,sans-serif;color:#333;}#mermaid-svg-PxFcryVbzrVGbyDB .cluster-label text{fill:#333;}#mermaid-svg-PxFcryVbzrVGbyDB .cluster-label span{color:#333;}#mermaid-svg-PxFcryVbzrVGbyDB .label text,#mermaid-svg-PxFcryVbzrVGbyDB span{fill:#333;color:#333;}#mermaid-svg-PxFcryVbzrVGbyDB .node rect,#mermaid-svg-PxFcryVbzrVGbyDB .node circle,#mermaid-svg-PxFcryVbzrVGbyDB .node ellipse,#mermaid-svg-PxFcryVbzrVGbyDB .node polygon,#mermaid-svg-PxFcryVbzrVGbyDB .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-PxFcryVbzrVGbyDB .node .label{text-align:center;}#mermaid-svg-PxFcryVbzrVGbyDB .node.clickable{cursor:pointer;}#mermaid-svg-PxFcryVbzrVGbyDB .arrowheadPath{fill:#333333;}#mermaid-svg-PxFcryVbzrVGbyDB .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-PxFcryVbzrVGbyDB .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-PxFcryVbzrVGbyDB .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-PxFcryVbzrVGbyDB .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-PxFcryVbzrVGbyDB .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-PxFcryVbzrVGbyDB .cluster text{fill:#333;}#mermaid-svg-PxFcryVbzrVGbyDB .cluster span{color:#333;}#mermaid-svg-PxFcryVbzrVGbyDB div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-PxFcryVbzrVGbyDB :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;} 10000000 11111111 00000000 01111111
等价于:
#mermaid-svg-lTHf83PCKDSAcRpR {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-lTHf83PCKDSAcRpR .error-icon{fill:#552222;}#mermaid-svg-lTHf83PCKDSAcRpR .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-lTHf83PCKDSAcRpR .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-lTHf83PCKDSAcRpR .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-lTHf83PCKDSAcRpR .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-lTHf83PCKDSAcRpR .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-lTHf83PCKDSAcRpR .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-lTHf83PCKDSAcRpR .marker{fill:#333333;stroke:#333333;}#mermaid-svg-lTHf83PCKDSAcRpR .marker.cross{stroke:#333333;}#mermaid-svg-lTHf83PCKDSAcRpR svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-lTHf83PCKDSAcRpR .label{font-family:\"trebuchet ms\",verdana,arial,sans-serif;color:#333;}#mermaid-svg-lTHf83PCKDSAcRpR .cluster-label text{fill:#333;}#mermaid-svg-lTHf83PCKDSAcRpR .cluster-label span{color:#333;}#mermaid-svg-lTHf83PCKDSAcRpR .label text,#mermaid-svg-lTHf83PCKDSAcRpR span{fill:#333;color:#333;}#mermaid-svg-lTHf83PCKDSAcRpR .node rect,#mermaid-svg-lTHf83PCKDSAcRpR .node circle,#mermaid-svg-lTHf83PCKDSAcRpR .node ellipse,#mermaid-svg-lTHf83PCKDSAcRpR .node polygon,#mermaid-svg-lTHf83PCKDSAcRpR .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-lTHf83PCKDSAcRpR .node .label{text-align:center;}#mermaid-svg-lTHf83PCKDSAcRpR .node.clickable{cursor:pointer;}#mermaid-svg-lTHf83PCKDSAcRpR .arrowheadPath{fill:#333333;}#mermaid-svg-lTHf83PCKDSAcRpR .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-lTHf83PCKDSAcRpR .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-lTHf83PCKDSAcRpR .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-lTHf83PCKDSAcRpR .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-lTHf83PCKDSAcRpR .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-lTHf83PCKDSAcRpR .cluster text{fill:#333;}#mermaid-svg-lTHf83PCKDSAcRpR .cluster span{color:#333;}#mermaid-svg-lTHf83PCKDSAcRpR div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-lTHf83PCKDSAcRpR :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;} 127 0 -128 -1
了解这些,我们就可以把上面的例子剖析
例子:
#includeint main() {int a = 2147483647;int b = 1;printf(\"%d %u\", a + b, a + b);return 0;}
运行结果:
(3)整型提升
提升规则
#mermaid-svg-4h2gUxgDXkEdRO6b {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-4h2gUxgDXkEdRO6b .error-icon{fill:#552222;}#mermaid-svg-4h2gUxgDXkEdRO6b .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-4h2gUxgDXkEdRO6b .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-4h2gUxgDXkEdRO6b .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-4h2gUxgDXkEdRO6b .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-4h2gUxgDXkEdRO6b .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-4h2gUxgDXkEdRO6b .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-4h2gUxgDXkEdRO6b .marker{fill:#333333;stroke:#333333;}#mermaid-svg-4h2gUxgDXkEdRO6b .marker.cross{stroke:#333333;}#mermaid-svg-4h2gUxgDXkEdRO6b svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-4h2gUxgDXkEdRO6b .label{font-family:\"trebuchet ms\",verdana,arial,sans-serif;color:#333;}#mermaid-svg-4h2gUxgDXkEdRO6b .cluster-label text{fill:#333;}#mermaid-svg-4h2gUxgDXkEdRO6b .cluster-label span{color:#333;}#mermaid-svg-4h2gUxgDXkEdRO6b .label text,#mermaid-svg-4h2gUxgDXkEdRO6b span{fill:#333;color:#333;}#mermaid-svg-4h2gUxgDXkEdRO6b .node rect,#mermaid-svg-4h2gUxgDXkEdRO6b .node circle,#mermaid-svg-4h2gUxgDXkEdRO6b .node ellipse,#mermaid-svg-4h2gUxgDXkEdRO6b .node polygon,#mermaid-svg-4h2gUxgDXkEdRO6b .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-4h2gUxgDXkEdRO6b .node .label{text-align:center;}#mermaid-svg-4h2gUxgDXkEdRO6b .node.clickable{cursor:pointer;}#mermaid-svg-4h2gUxgDXkEdRO6b .arrowheadPath{fill:#333333;}#mermaid-svg-4h2gUxgDXkEdRO6b .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-4h2gUxgDXkEdRO6b .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-4h2gUxgDXkEdRO6b .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-4h2gUxgDXkEdRO6b .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-4h2gUxgDXkEdRO6b .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-4h2gUxgDXkEdRO6b .cluster text{fill:#333;}#mermaid-svg-4h2gUxgDXkEdRO6b .cluster span{color:#333;}#mermaid-svg-4h2gUxgDXkEdRO6b div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-4h2gUxgDXkEdRO6b :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;} 对象 有符号数 正数 高位补0 无符号数 看补码 最高位为1则高位补1.否则补0 负数 高位补1
本质就是看补码的最高位是1还是0,是1补1,是0补0。
(4)数据截断
熟练掌握这些,我们就基本能预见和理解整型数据运算屏幕上打印的结果,下面就以一些例子来加深和巩固对以上知识的理解
例:
#includeint main() {char a = 3;//00000011char b = 127;//01111111char c = a + b;//因a和b参加运算,所以要发生整型提升//整型提升规则:高位补符号位(在大部分编译器中,char等价于signed char,即有符号,最高位为符号位,范围为:-128~127;无符号的char类型数据范围为:0~255;//整型提升://00000000000000000000000000000011//00000000000000000000000001111111//结果00000000000000000000000010000000//截断(发生在高字节类型转化为低字节)://10000000 补码//10000011printf(\"%d\", c);//打印结果为:-126return 0;}//也可以用圆环秒解:0 1 2 ~ 126 127 ~-1 -2 -3 ~ -127 -128 ~ 0 1 2 ~~
- 注释的解析很全,不用再过多解释,对照上面的知识点进行理解
三、大小端介绍
1.来历
这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit位。但是在c语言中除了8bit的char之外,还有16bit位的short型,32位的long型(取决于具体编译器);另外,对于位数大于8位的处理器(16bit或32bit),由于寄存器宽度大于一个字节,那么必然存在着一个如何将多个字节安排进内存中存储的问题。由此产生了大端和小端。
2.模式介绍及效果
实际效果:
自己模拟
VS2022上的内存窗口
3.模式判断
我们可以借助一个2015年百度的笔试题观察大小端的区别
题目:写一个代码,实现大小端的判断
代码:
#includeint main() {int a = 1;char* p = (char*)&a;if (*p == 1) {printf(\"是小端\\n\");} else {printf(\"是大端\\n\");}return 0;}
思路: