char //字符数据类型
short //短整型
int //整形
long //长整型
long long //更长的整形
float //单精度浮点数
double //双精度浮点数
//C语言有没有字符串类型?
答案是肯定的——没有,字符串存储是以放在每个内存地址中
我们所知道的类型有整形,单精度,字符型,构造型,指针型等
但是我们是否知道他还分有符号位和无符号位呢,是否知道他们是怎么存到计算机里的。
众所周知,大部分人都知道计算机是有0和1,也就是我们所熟知的二进制,为什么我们
要用二进制呢,是因为二进制0和1代表低电压和高电压,代表了每个指令,所以我们数据
在存储的时候也是以二进制的形式存取的。
char类型和int类型,我们知道char类型是字符型,但是我们是否知道char类型其实本质也是
整形,比如A的ascci码值等等,其实也都是以一个整形数字存放的。
所以我们介绍介绍整形家族
整形家族
char
unsigned char 无符号字符型,取值范围是0~255
signed char 有符号字符型,取值范围是-128~127
short 其余的类似
unsigned short [int]
signed short [int]
int
unsigned int
signed int
long
unsigned long [int]
signed long [int]
我们知道范围是这些,但是我们怎么知道在内存中这些数值是怎么样的,接下来
带你看一看
整形在内存中的存储
那么我们看看10这个数在内存是怎么样的,
跟我们所描述的一样,只不过这里以十六进制显示了,如果不会十六进制的同学自行百度下,那这还有小伙伴有疑问了,为什么是倒着的,这个我在稍后会讲,我们先理清数据的二进制形式,是以原码还是反码还是补码的数据段在内存中存储的。
上述我们知道是以原码形式存放的
那么这个呢
我们看到的地址为什么是这样的呢
是因为负数在内存中存放的是以补码形式存放的
对于整形来说:数据存放内存中其实存放的是补码。 为什么呢? 在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统 一处理; 同时,加法和减法也可以统一处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程 是相同的,不需要额外的硬件电路
原码,反码,补码就不介绍了,这个比较基础,可以自行百度
数据的大小端(数据类型超过一个字节才会有,char类型存储的时候没有大小端)
什么大端小端:
大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址 中;
小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地 址中。
我们来验证一下
但是我们这只有这一种情况了吗,当然不是,其他编译器可能是大端模式。
下面我们来练几道题,然后进行分析
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;
}
这里会有疑问,什么是整形提升,什么是截断!!截断通俗的说就是例如上述所讲超过四个字节的数只留一个字节的数,截断都是从高位截断
什么是整形提升!!!
在K&R和C89的早期实现中,基于short和char的算术运算陷入两难的困境,因为可能会产生两种不同的结果。因此,在C99中很明确地定义了整型提升的规则. 如果int能够表示原始类型中的所有数值,那么这个数值就被转成int型,否则,它被转成unsigned int
型。这种规则被称为整型提 升。所有其它类型都不会被整型提升改变。
为什么需要整形提升?
- c语言中整型算术运算总是以至少以缺省整型类型的精度来进行的,为了获取这种精度,表达式中的字符和短整型操作数在使用之前转换为普通整型,这种转换称为整型提升。
- 整型提升分为有符号的整型提升和无符号的整型提升。
- 有符号的整型提升按照变量数据类型的符号位来提升;无符号的整型提升按照高位补0来提升。
比如定义了三个char类型的数,现在把其中两个数相加并赋值给第三个数,相加的两个数就要进行整型提升。相加的结果赋给第三个数时需要进行截断,因为int型在内存中占4个字节,char型占1个字节。
//输出什么
2.
#include <stdio.h>
int main()
{
char a = -128;
printf("%u\n", a);
return 0;
}
3.
//输出什么
#include <stdio.h>
int main()
{
char a = 128;
printf("%u\n", a);
return 0;
}
4.
//输出什么
//是以什么形式计算的
#include <stdio.h>
int main()
{
int i = -20;
unsigned int j = 10;
printf("%d\n", i + j);
return 0;
}
5.
//输出什么
#include <stdio.h>
int main()
{
unsigned int i;
for (i = 9; i >= 0; i--)
{
printf("%u\n", i);
}
return 0;
}
答案是死循环:为什么会一直死循环呢,是因为unsigned int 类型没有负数,所以这个类型的值0-1就为最大数了
就像一个圆一样
6.
//输出什么
#include <stdio.h>
int main()
{
char a[1000];
int i;
for (i = 0; i < 1000; i++)
{
a[i] = -1 - i;
}
printf("%d", strlen(a));
return 0;
}