☰
C语言二刷强化(数据在内存中的存储)
2026/9/29 6:59:44 网站建设 项目流程

目录

1. 整数在内存中的存储

2. 大小端字节序和字节序判断

3. 浮点数在内存中的存储

1. 整数在内存中的存储

整数的 2 进制表示方法有三种,即原码、反码和补码。

有符号的整数,三种表示方法均有符号位和数值位两部分,符号位都是用 0 表示“正”,用 1 表示“负”,最高位的一位是被当作符号位,剩余的都是数值位。

正整数的原、反、补码都相同。负整数的三种表示方法各不相同。

原码:直接将数值按照正负数的形式翻译成二进制得到的就是原码。

反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。

补码:反码 + 1 就得到补码。

对于整型来说:数据存放内存中其实存放的是二进制的补码。

2. 大小端字节序和字节序判断

2.1 什么是大小端?其实超过一个字节的数据在内存中存储的时候,就有存储顺序的问题,按照不同的存储顺序,我们分为大端字节序存储和小端字节序存储,下面是具体的概念:

举个例子: int a = 0x11223344; 大端存储: 11 22 33 44 小端存储: 44 33 22 11 地址: 低 -------> 高

2.3 练习:

2.3.1 判断大小端字节存储

#include <stdio.h> int check_sys() { int i = 1; return (*(char *)&i); } int main() { int ret = check_sys(); if (ret == 1) { printf("小端\n"); } else { printf("大端\n"); } return 0; }
#include <stdio.h> int main() { char a = -1; // 10000000 000000000 00000000 00000001 -1 的原码 // 11111111 111111111 11111111 11111110 // 11111111 111111111 11111111 11111111 -1 的补码,在这个时候 -1 存放到 a 里 // a 里存储的是 11111111 signed char b = -1; unsigned char c = -1; printf("a = %d, b = %d, c = %d", a, b, c); // -1, -1, 255 // %d 是以十进制打印一个有符号数,所以对 char 类型进行整型提升,前面全按符号位补 // 11111111 11111111 11111111 11111111 a 经过整型提升的补码就是这样 // 取反加一得到原码打印 // b 和 a 同理 // unsigned 进行整型提升 // 00000000 00000000 00000000 11111111 // 那对于 %d,符号位是 0,所以认为是正数,原反补相同,直接打印为 255 return 0; }
#include <stdio.h> int main() { char a = -128; // 10000000 00000000 00000000 10000000 // 11111111 11111111 11111111 01111111 // 11111111 11111111 11111111 10000000 // a 存储的就是 --> 10000000 printf("%u\n", a); // 4294967168 // %u 打印进行整型提升 // 11111111 11111111 11111111 1000000 // 对于 %u 来说,不分正负,不存在符号位,直接当正数打印 return 0; }
#include <stdio.h> int main() { char a = 128; // 00000000 00000000 00000000 10000000 // a --> 10000000 printf("%u\n", a); // %u 打印进行整形提升 // 11111111 11111111 11111111 10000000 // 对于 %u 来说,不分正负,不存在符号位,直接当正数打印 return 0; }
#include <stdio.h> #include <string.h> int main() { char a[1000]; int i; for (i = 0; i < 1000; i++) { a[i] = -1 - i; } /* 当 i = 127 时,a[127] = -128(此时到达了 char 的最小值) 当 i = 128 时,-1 - 128 = -129。由于 char 只有 8 位,-129 超出了范围,发生了下溢。 在二进制补码中,-129 截断为 8 位变成了 127(01111111)。 此后,值开始在 127 往下递减:127, 126, 125... 当 i = 255 时,-1 - 255 = -256。 -256 的二进制补码(9位)是 1 0000 0000,截断为 8 位后变成 0000 0000,也就是整数 0(即 '\0')。 */ printf("%d", strlen(a)); return 0; }
#include <stdio.h> //X86环境,⼩端字节序 int main() { int a[4] = { 1, 2, 3, 4 }; int* ptr1 = (int*)(&a + 1); int* ptr2 = (int*)((int)a + 1); printf("%x, %x", ptr1[-1], *ptr2);//02 00 00 00, %x 是以16进制打印 return 0; }

3. 浮点数在内存中的存储

#include <stdio.h> int main() { int n = 9; // 00000000 00000000 00000000 000010001 源反补 // 0 00000000 00000000000000000001001 // (-1)^0 * 0.00000000000000000001001 * 2^-126 float* pFloat = (float*)&n; printf("n的值为: %d\n", n); printf("*pFloat的值为: %f\n", *pFloat); *pFloat = 9.0; // (-1)^0 *1.001 * 2^3 // 0 10000010 00100000000000000000000 printf("n的值为: %d\n", n); // %d打印的时候认为存的是补码 printf("*pFloat的值为: %f\n", *pFloat); return 0; }

// 举例子: // 5.0 的存储(101) // (-1)^0 * 1.01 * 2^2 // // 5.5 的存储(101.1,0.1 表示 0.5) // (-1)^0 * 1.011 * 2^2

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询