目录
1.数据类型的介绍:
char类型的变量在内存中是以ascⅡ的形式储存,所以也是整形家族的一员。
2.整形在内存中的储存方式:
在计算机中整数有三种二进制的表示方法,即原码,反码,补码。
在原码中最高位为符号位,0表示正数,1表示负数。
2.1原码、反码、补码的关系:
正整数的原码、反码、补码不变,都是相同的。
负整数的反码是原码的相反,即0变1,1变0,但符号位不变.
补码是反码加一得到的。
如:-1
对于整形在内存中是以补码的方式进行存储。
为什么呢?
因为cpu只有加法器,使用补码,我们能把符号位和数值位统一处理,加法和减法统一处理。
2.2大小端介绍(字节储存的顺序问题)
![](https://i-blog.csdnimg.cn/blog_migrate/9ac5c9f4e0203288ee34de3a21ef4bbb.png)
问什么会有大小端存储?
应为除啦一个字节的char,其他的整形都是多字节的,这是就会涉及每个字节存放顺序的问题,可以低地址处存放权重低的 ,也可以低字节处存放权重大的。
此处我们用计算机看看字节存放的顺序
可以看处78位于权重低的位置,放在低字节处,12位于权重高的地方位于高字节处。
此处我们用程序判断大小端的问题
大小端储存模式的判断 · 风夏/C语言进阶 - 码云 - 开源中国 (gitee.com)
#include<stdio.h>
int main()
{
int a = 1;
char* p = &a;
if (*p)
{
printf("小端存储\n");
}
else
{
printf("大端存储\n");
}
return 0;
}
3.加减法运算的问题(数字大小超过类型的上限)
例题1:
#include <stdio.h>
int main()
{
char a= -1;
signed char b=-1;
unsigned char c=-1;
printf("a=%d,b=%d,c=%d",a,b,c);
return 0;
}
char a占一个字节,二进制表示为:
-1占四个字节,在放入char类型时,因为放不下我们会发生截断,我们把最后8个比特位放进去
当它以%d的形式输出时,会发生补位的现象,现在最高位为一,前面就补3个字节的1,让后以%d的形式输出,所以第一个结果为-1,
同理可得第二个结果和第一个一样,第二个结果为-1
第三个当-1的补码放入unsigned char时,由于只有一个字节仍然为8个1;当它以%d的形式输出时,因为是无符号的,直接补0;即第三个结果为255
例题2:
#include <stdio.h>
int main()
{
char a = -128;
printf("%u\n",a);
return 0;
}
-128存放的char中发生截取,后面因为%u的输出,原来a的类型为有符号的char,我们补位时不最高位的数字,即1(补位规则),让后以%u的形式输出,最后结果
例题3:
#include <stdio.h>
int main()
{
char a = 128;
printf("%u\n",a);
return 0;
}
char类型变量的大小为-128到127,此时128已超过范围,当128,放进去时会被视为-128,补位时char a是有符号的类型,补最高位的1,最后结果
例题4:
#include <stdio.h>
unsigned char i = 0;
int main()
{
for(i = 0;i<=255;i++)
{
printf("hello world\n");
}
return 0; }
此题于上题类似,unsigned char 最大值为255,当i=256时,会被视为0,重新开始循环。所以此题为死循环