一.数据类型的介绍
首先我们需要了解一下C语言中常用的数据类型
char -——字符数据类型
short ——短整型
int ——整形
long ——长整型
long long ——更长的整形
float ——单精度浮点数
double ——双精度浮点数
数据类型的意义:
1.使用这个类型可以在系统内存中申请多大的空间
2.可以通过数据类型的视角去看待内存空间
二.类型的分类
1.整型家族
char
short
int
long
其中每一种数据类型都可以分为
signed (类型) 有符号的
unsigned (类型) 无符号的
这里很多人会有点疑惑,为什么char类型属于整型家族?
因为:在计算机中字符是以ASCII值来存储的
2.浮点数家族
float
double
3.构造类型(自定义类型)
数组
结构体 (struct)
枚举 (enum)
联合类型 (union)
这里为什么说数组也是构造类型?
int main()
{
int arr[10] = { 0 };
// 数组名是arr
// 类型是 int [10];
// 我们可以自己定义 类型 和 数组的大小
return 0;
}
4.指针类型
char* p
short* p
int* p
void* p
…
5.空类型
void 表示空类型
通常应用于函数的返回类型、函数的参数、指针类型
二.整型在数据中的存储
1.原码,反码,补码
在计算机中整数有三种二进制表达方式,原码,反码, 补码。三种表示方法均有符号位(最高位)和数值位两部分,符号位都是用0表示“正”,用1表示“负”
正数的原、反、补码都相同。
负整数的三种表示方法各不相同。
原码:
直接将数值按照正负数的形式翻译成二进制就可以得到原码。
反码:
将原码的符号位不变,其他位依次按位取反就可以得到反码
补码:
在反码的基础上加1就可以得到补码
举个栗子:
int i = 10;
//原码;00000000000000000000000000001010
//补码:01111111111111111111111111110101
//补码;01111111111111111111111111110110
接下来,我们来看几个列子:
列1:
int main()
{
char a = -1;
//此时的-1是整型的
//原码 10000000000000000000000000000001
//反码 11111111111111111111111111111110
//补码 11111111111111111111111111111111
//
//此时一个整形的数字被放进 char类型会发生截断
//char 中存储的补码为 后8位 11111111
signed char b = -1;
//补码 11111111
unsigned char c = -1;
//补码 11111111
//此时被打印成整型(char - int),需要进行整型提升 (按原来的类型(有无符号))
//有符号的用符号位补齐
//无符号的用0补齐
//提升之后在转化为原码在打印
printf("a = %d b = %d c = %d\n", a, b, c); // 结果为: -1 -1 255
return 0;
}
列2:
int main()
{
char a = -128;
//原码:10000000000000000000000010000000
//反码:11111111111111111111111101111111
//补码:11111111111111111111111110000000
//补码截断;100000000
//此时的a是以无符号的整型进行打印
//因此 需要先进行整型提升 100000000 (char 是有符号的)
//此时最高位为有符号数
//11111111111111111111111110000000 —补码
//最后在转化为原码(无符号的,原反补相同)进行无符号打印
printf("%u\n", a);
//进行整型的打印
//需要先转化为原码然后打印 -128
printf("%d\n", a);
return 0;
}
列3(涉及到算数转换)
int main()
{
int i = -20;
//原码:10000000000000000000000000010100
//反码;11111111111111111111111111101011
//补码;11111111111111111111111111101100
unsigned int j = 10;
//无符号数;原反补相同
//00000000000000000000000000001010
printf("%d\n", i + j); //无符号的数和有符号的数相加会进行(算数转换,有符号的转换成无符号的)
//11111111111111111111111111101100
//00000000000000000000000000001010
//11111111111111111111111111110110 //补码相加得到的
//转换成原码打印
//10000000000000000000000000001010 //-10
return 0;
}
列4(循环)
int main()
{
unsigned int i;
//站在i 的视角 i是无符号的 i >= 0 (判断部分永远成立)
for (i = 9; i >= 0; i--)
{
printf("%d\n", i);
}
//死循环
//原因是;无符号数的整型 >= 0
return 0;
}
列5
#include <string.h>
int main()
{
char a[1000] = { 0 };
int i = 0;
for (i = 0; i < 1000; i++)
{
a[i] = -1 - i;
//-1 .......-128 127......0 ( \0(结束标志) 的ASCII值就是 0)
//i = 254时 a[i] = 0
printf("%d\n", strlen(a)); //255
}
return 0;
}