在电脑中存在许多的数据,整型,浮点型,还有结构类型。 先来看看整型的存储。
正负数在内存中都是以补码的方式存储,正数的原码,反码和补码都是相同的,而负数是的原码取反+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;
}