数据的存储(计算机存储的两种模式)(大端和小端)

在电脑中存在许多的数据,整型,浮点型,还有结构类型。 先来看看整型的存储。
正负数在内存中都是以补码的方式存储,正数的原码,反码和补码都是相同的,而负数是的原码取反+1才能得到反码,
大小端 在内存中数据存储的方式有两种,一种是大端字节序储存,一种是小端字节序储存。
什么是大端和小端呢?其实很简单
大端存储:把一个数的低字节内容存放到高地址处,高字节内容放到低地址处。
小端存储:把一个数的高字节内容存放到低地址处,低字节内容放到高地址处。
先来举个栗子吧

#include int main() { int a = 0x11223344; return 0; }

数据的存储(计算机存储的两种模式)(大端和小端)
文章图片

【数据的存储(计算机存储的两种模式)(大端和小端)】如果要证明我们的电脑是什么储存方式就可以如下:
#include int main() { int a = 0x00000001; char* p = (char*)&a; printf("%d\n", *p); return 0; }

我用char * 的指针访问int 类型的数据,这样就可以只看见a这个16进制数的一个字节,因为我们访问都是从低地址访问,所以如果是小端存储,*p就是1,反之,若是大端存储,*p就是0。
数据的存储(计算机存储的两种模式)(大端和小端)
文章图片

int check_sys() { int a = 0x11000000; return*(char*)&a; }int main() { if (check_sys() == 0) { printf("小端\n"); } else { printf("大端\n"); } return 0; }

由图可知,显然电脑是小端存储的。
然后在存储模式的基础上我来讲讲整形提升的概念,直接肝题目比较直接
#include int main() { unsigned char a = 200; unsigned char b = 100; unsigned char c = 0; c = a + b; printf("%d %d", a + b, c); return 0; }

由题可知,a = 200,200是一个整型变量,但是被逼无奈a又是一个unsigned char型的变量,所以当200存放到a中的时候会发生数据丢失,二进制数字会被强行截断,200本来在内存中是00000000000000000000000011001000但是在a中就变成了11001000,同理b本来是00000000000000000000000001100100,但是在b中变成了01100100,此时a + b = 100101100
数据的存储(计算机存储的两种模式)(大端和小端)
文章图片

但是c只能存放8个比特位所以最前面的1就被丢失了,所以a+b=300但是c= a+b =44
下面接要几道题目来理解整型的存储方式
int main() { //-1的补码 //1111111111111111111111111111111 //char类型折断 //11111111 //当char类型的数据要转换%d,int类型是要整型提升,有符号的数据+1,无符号的数据+0 char a = -1; signed char b = -1; unsigned char c = -1; //unsiged int 因为无符号,所以整型提升前面全+0 //00000000000000000000000011111111 printf("%d %d %d\n", a, b, c); return 0; }

int main() { char a = -128; //10000000000000000000000010000000 //11111111111111111111111110000000 //整型提升 //11111111111111111111111110000000 printf("%u\n", a); return 0; }

int main() { char a = 128; //00000000000000000000000010000000 //11111111111111111111111101111111 //11111111111111111111111110000000 //10000000 //整型提升 //11111111111111111111111110000000 printf("%u\n", a); return 0; }

int main() { unsigned int i; for (i = 9; i >= 0; i--) { printf("%u\n", i); //死循环打印 } return 0; }

#include int main() { char a[1000]; int i = 0; for (i = 0; i < 1000; i++) { a[i] = -1 - i; } printf("%d\n", strlen(a)); return 0; }

    推荐阅读