一、整数在内存中的存储1.计算机中有符号整数的三种二进制编码方式原码最高位为符号位0正1负其余位为数值的绝对值二进制反码符号位不变其余位按位取反仅用于负数补码反码 1仅用于负数正数的原码 反码 补码。2.为何内存中存的是补码- 符号位和数值位统一处理无需区分- 加法器即可做减法x - y x (-y 的补码)CPU 无需额外减法器- 补码和原码互转的运算过程相同取反 1硬件复用二、大小端字节序和字节序判断其中内存当中a的地址是倒着存的这是因为当前系统是小端。2.1.什么是大小端多字节数据在内存中的存储顺序分两种- 低位字节存高地址高位在前类似写数字从左到右- 小端低位字节存低地址高位字节存高地址低位在前x86 架构例数字 0x12345678从低地址到高地址| 大端 | 12 | 34 | 56 | 78 || 小端 | 78 | 56 | 34 | 12 |2.2.为什么有大小端根本原因寄存器宽度 字节宽度多字节数据就要排顺序。- CPU 一次能处理 16/32/64 位多字节但内存按字节编址每个地址存 1 个字节- 所以一个 short2 字节或 int4 字节必须拆成多个字节分几个地址存放这就产生了顺序问题典型- x86 → 小端- ARM/DSP → 多小端可配置- KEIL C51 → 大端一句话因为一个数字占多个地址单元先存高位还是先存低位各家 CPU 设计选择了不同方案。2.3.练习2.3.1 练习1请简述大端字节序和小端字节序的概念设计⼀个小程序来判断当前机器的字节序。10分-百度笔试题#includestdoi.h int check_sys() { int a1; return *(char*)a; } int main() { if(check_sys()1) { printf(小端); } else { printf(大端); } return 0; }当前平台为x64然后输出小端。2.3.2 练习2#include stdio.h int main() { char a -1; signed char b-1; unsigned char c-1; printf(a%d,b%d,c%d,a,b,c); return 0; }答案如下https://i-blog.csdnimg.cn/direct/b83c2e48e5144c47a0bab6615eacd26b.png2.3.3 练习3这是左边题目的解题过程补码为1111 1111 1111 1111 1111 1111 1000 0000最后按照%u来打印是按照无符号整数来打印结果为4294967168右边题目因为char 默认是signed char为有符号类型它只能输出-128-127之间的数所以128存进内存时为1000 0000此时已经溢出了因为最高位被当做符号位了1000 0000被认为是-128的补码不是128所以最后扩展为int时候补充的是1结果还是为42949671682.3.4 练习4答案https://i-blog.csdnimg.cn/direct/97dab134fbcc4411be54769baba1b4d3.png2.3.5 练习5左边代码超出了char类型255的界限右边代码也超出了int类型的0变成了负数不在范围内。所以两个代码都会死循环。2.3.6 练习6三、浮点数在内存中的存储3.1浮点数的存储规则3.2 练习题目解析*pFloat在n9时二进制为0 00000000 00000000000000000001001第一个0为S代表正负数后面8个0代表E再后面的23位代表M即值应该为(-1)的0次方*0.00000000000000000001001*2的-126次方结果值为0.000000%f最多显示小数点后六位。*pFloat9.0后它的二进制为1001.0用IEEE标准公式直接计算就行-1的0次方*1.001*2的3次方S0E3指数 127130 当E等于1-254时才127等于255时为无穷大或者NaNM1.001前导1隐含只存后面的001按照32位二进制可以写成0 10000010 00100000000000000000000转换成10进制结果就为1091567616*pFloat9.0时会自动进行IEEE的编码3.2 浮点数的存储回顾3.2.1 浮点数存的过程IEEE 754 对有效数字M和指数E还有⼀些特别规定。前面说过 1≤M2 也就是说M可以写成 1.xxxxxx 的形式其中 xxxxxx 表示小数部分。 IEEE 754 规定在计算机内部保存M时默认这个数的第⼀位总是1因此可以被舍去只保存后面的 xxxxxx部分。比如保存1.01的时候只保存01等到读取的时候再把第⼀位的1加上去。这样做的目的是节省1位有效数字。以32位浮点数为例留给M只有23位将第⼀位的1舍去以后等于可以保存24位有效数字。至于指数E情况就比较复杂首先E为一个无符号整数unsigned int这意味着如果E为8位它的取值范围为0~255如果E为11位它的取值范围为0~2047。但是我们知道科学计数法中的E是可以出现负数的所以IEEE 754规定存入内存时E的真实值必须再加上一个中间数对于8位的E这个中间数是127对于11位的E这个中间数是1023。比如2^10的E是 10所以保存成32位浮点数时必须保存成10127137即10001001。3.2.2 浮点数取的过程
从零开始玩转C语言(五):整数和浮点数在内存中的存储
发布时间:2026/7/1 6:51:20
一、整数在内存中的存储1.计算机中有符号整数的三种二进制编码方式原码最高位为符号位0正1负其余位为数值的绝对值二进制反码符号位不变其余位按位取反仅用于负数补码反码 1仅用于负数正数的原码 反码 补码。2.为何内存中存的是补码- 符号位和数值位统一处理无需区分- 加法器即可做减法x - y x (-y 的补码)CPU 无需额外减法器- 补码和原码互转的运算过程相同取反 1硬件复用二、大小端字节序和字节序判断其中内存当中a的地址是倒着存的这是因为当前系统是小端。2.1.什么是大小端多字节数据在内存中的存储顺序分两种- 低位字节存高地址高位在前类似写数字从左到右- 小端低位字节存低地址高位字节存高地址低位在前x86 架构例数字 0x12345678从低地址到高地址| 大端 | 12 | 34 | 56 | 78 || 小端 | 78 | 56 | 34 | 12 |2.2.为什么有大小端根本原因寄存器宽度 字节宽度多字节数据就要排顺序。- CPU 一次能处理 16/32/64 位多字节但内存按字节编址每个地址存 1 个字节- 所以一个 short2 字节或 int4 字节必须拆成多个字节分几个地址存放这就产生了顺序问题典型- x86 → 小端- ARM/DSP → 多小端可配置- KEIL C51 → 大端一句话因为一个数字占多个地址单元先存高位还是先存低位各家 CPU 设计选择了不同方案。2.3.练习2.3.1 练习1请简述大端字节序和小端字节序的概念设计⼀个小程序来判断当前机器的字节序。10分-百度笔试题#includestdoi.h int check_sys() { int a1; return *(char*)a; } int main() { if(check_sys()1) { printf(小端); } else { printf(大端); } return 0; }当前平台为x64然后输出小端。2.3.2 练习2#include stdio.h int main() { char a -1; signed char b-1; unsigned char c-1; printf(a%d,b%d,c%d,a,b,c); return 0; }答案如下https://i-blog.csdnimg.cn/direct/b83c2e48e5144c47a0bab6615eacd26b.png2.3.3 练习3这是左边题目的解题过程补码为1111 1111 1111 1111 1111 1111 1000 0000最后按照%u来打印是按照无符号整数来打印结果为4294967168右边题目因为char 默认是signed char为有符号类型它只能输出-128-127之间的数所以128存进内存时为1000 0000此时已经溢出了因为最高位被当做符号位了1000 0000被认为是-128的补码不是128所以最后扩展为int时候补充的是1结果还是为42949671682.3.4 练习4答案https://i-blog.csdnimg.cn/direct/97dab134fbcc4411be54769baba1b4d3.png2.3.5 练习5左边代码超出了char类型255的界限右边代码也超出了int类型的0变成了负数不在范围内。所以两个代码都会死循环。2.3.6 练习6三、浮点数在内存中的存储3.1浮点数的存储规则3.2 练习题目解析*pFloat在n9时二进制为0 00000000 00000000000000000001001第一个0为S代表正负数后面8个0代表E再后面的23位代表M即值应该为(-1)的0次方*0.00000000000000000001001*2的-126次方结果值为0.000000%f最多显示小数点后六位。*pFloat9.0后它的二进制为1001.0用IEEE标准公式直接计算就行-1的0次方*1.001*2的3次方S0E3指数 127130 当E等于1-254时才127等于255时为无穷大或者NaNM1.001前导1隐含只存后面的001按照32位二进制可以写成0 10000010 00100000000000000000000转换成10进制结果就为1091567616*pFloat9.0时会自动进行IEEE的编码3.2 浮点数的存储回顾3.2.1 浮点数存的过程IEEE 754 对有效数字M和指数E还有⼀些特别规定。前面说过 1≤M2 也就是说M可以写成 1.xxxxxx 的形式其中 xxxxxx 表示小数部分。 IEEE 754 规定在计算机内部保存M时默认这个数的第⼀位总是1因此可以被舍去只保存后面的 xxxxxx部分。比如保存1.01的时候只保存01等到读取的时候再把第⼀位的1加上去。这样做的目的是节省1位有效数字。以32位浮点数为例留给M只有23位将第⼀位的1舍去以后等于可以保存24位有效数字。至于指数E情况就比较复杂首先E为一个无符号整数unsigned int这意味着如果E为8位它的取值范围为0~255如果E为11位它的取值范围为0~2047。但是我们知道科学计数法中的E是可以出现负数的所以IEEE 754规定存入内存时E的真实值必须再加上一个中间数对于8位的E这个中间数是127对于11位的E这个中间数是1023。比如2^10的E是 10所以保存成32位浮点数时必须保存成10127137即10001001。3.2.2 浮点数取的过程