我们首先引入大小端的概念
int main()
{
unsigned int a = -10;
return 0;
}
变量a在内存中的存储形式是什么呢?
答:我们进行分析,我们首先要写出-10的补码,-10的源码是1000 0000 0000 0000 0000 0000 0000 1010 ,-10的反码是1111 1111 1111 1111 1111 1111 1111 0101 对应的补码是1111 1111 1111 1111 1111 1111 1111 0110 ,我们知道,整型在内存中的存储形式是16进位制的,所以-10的补码对应的16进位制的结果是FF FF FF F6,我们进行调试,看看a在内存中的存储
我们可以发现,整型a在内存中的存储形式是F6 FF FF FF,和我们推算的结果是相反的,原因是什么?这就涉及到大小端问题了
这里插一嘴前面学习过的内容
int main()
{
unsigned int a = -10;
printf("%dn", a);
printf("%un", a);
return 0;
}
两个问题
1:打印出来的两个结果是什么?
2:这里的存和取分别对应什么?
1:答:
原因是什么呢?整型存储的时候是不关乎类型的,只有取的时候需要关乎类型,就想之前我们所说的,存进去的-10对应的二进位制的补码是1111 1111 1111 1111 1111 1111 1111 0110,这就叫做存,无论我们是有符号类型还是无符号类型,存储的结果都是相同的,但我们用有符号整型取时,存进去的-10,所以取出来的结果也是-10,当我们用无符号整型取时,我们进行分析,1111 1111 1111 1111 1111 1111 1111 0110,因为我们是无符号整型,所以没有源码反码补码的概念,二进位制中的首位1对应的不是符号位,计算出来的数字就是二进位制1111 1111 1111 1111 1111 1111 1111 0110对应的数字
得出结论:存储的时候,和类型无关,当取出的时候,和类型有关
大小端字节序大小端字节序是非常容易理解的
例如0x11 22 33 44,这里的11代表的是高权值位,44代表的是低权值位
当用小端字节序存储时,对应的结果是0x44 33 22 11,内存中,从左到右,从上到下,地址逐渐增高,44对应的地址是低地址,对应的权值也是低权值
一句话总结:小端字节序存储,低权值位数据存储在低地址处
当用大端字节序存储时,对应的结果是0x11 22 33 44 ,44对应的是高地址,44对应的权值位是低权值位
一句话总结:大端字节序存储,低权值位数据存储在高地址处
注意:无论是大小端存储,怎么存的怎么取,所以大小端存储并不会改变数据的值
大端存储是顺序,小端存储是逆序
类型的取值范围首先,我们介绍一下signed(有符号)char
因为char类型的数据占八个比特位,第一位是符号位,所以signed char取的最小值是1 1111 111,取得最大值是0 1111 111,所以得到的结果是{-127,127},对吗?
答:结果是不对的,因为我们char类型占八个字节,八个字节所对应的数据个数有256个,但我我们的-127到127只有255个,所以我们少算了一个,不对
为什么会出现这种情况呢?
答:当我们为对应的是正数的时候,对应的结果是0到127,对应的是负数的时候,对应的结果是0到-127,我们可以发现,0出现了两次,但是每一个二进位制所能代表的结果只有一个,所以出现错误,错误的原因是0000 0000代表的是0,而我们把1000 0000也看成了0,所以产生错误,1000 0000表示的数字只能是128,因为是负数,所以是-128,所以signed char类型的取值范围是【-128,127】
如何存储int main()
{
char a = -128;
printf("%d", a);
return 0;
}
-128对应的二进位制的结果是1 1000 0000,我们可以发现,出现了9位,是否合法呢?答案是合法的,1 1000 0000对应的反码是1 0111 1111,对应的补码是1 1000 0000,我们再进行截断,得到的结果是1000 0000,这就是char类型存储对应的过程
题目int main()
{
char a[1000];
for (int i = 0; j < 1000; i++)
{
a[i] = -1 - i;
}
printf("%dn", strlen(a));
return 0;
}
这道题要怎么做
答:首先,数组a是char类型的,char类型的取值范围是【-128,127】,当i=0时,数组a的第一个元素是-1,当i=127时,数组对应的元素是-128,接下来当i=128时,128对应的二进位制的补码是1000 0000,-1对应的补码是1111 1111,相加的结果是1 0111 1111,我们进行截断,得到的结果是0111 1111,对应的结果是127,所以随着i的增加,数组内部被初始化的元素是从-1到-128,再从127到0,并且0不计入元素范围,所以得到的结果是-1到-128一共128个元素,127到1一共127个元素,所以数组a的元素有255个,所以打印结果为255



