目录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 位变成了 12701111111。 此后值开始在 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.10.1 表示 0.5 // (-1)^0 * 1.011 * 2^2