一、数据类型
1.整型数据类型
对于整型数据而言,它们默认都是有符号的。
int main()
{
char; //1byte
short; //2byte
int ; //4byte
long int; //4byte
long long; //8byte
//无符号类型unsigned
unsigned char; //1byte
unsigned short; //2byte
unsigned int ; //4byte
unsigned long int; //4byte
unsigned long long; //8byte
return 0;
}
2.浮点数据类型和其他类型
对于浮点数来说,它们是后期加进去的,本身就是有符号的。
int main()
{
float; //4byte;
double; //8byte;
long double; //8byte,12byte,16byte;
bool; //1byte 一个比特位;
void; //不能定义变量,但是能定义指针;
return 0;
}
二、数据在内存中的存储方式
一般而言,我们计算机遵循小端存放。
怎么检测当前系统是否是小端存放?
int main()
{
short ch=0x0001;
char*p=(char*)ch;//让指针指向高位,如果检测出来是00则是大端存放;
if(*p==1)
{
printf("xiao\n");
}
else
{
printf("da\n");
}
return 0;
}
1.计算机存储数据的方式
- 计算机存储的是数据的补码。
原码:就是二进制表示法,即最高位是符号位(0为正,1为负),其余位数为数值的大小。
正数的原码反码补码都是相同的。
负数的原码是符号位不变,其余数据按位取反得反码,反码+1得补码。
类型的表示是有一定范围的,例如char类型它表示的范围是-128~127。
在执行函数或者打印函数时,一定要注意类型可以表示的范围,以下给出示例:
#include<stdio.h>
int main()
{
for (char a = 0; a < 128; ++a)
{
printf("%4d", a);
}
printf("\n");
return 0;
}
解析:正数范围到127截止,即0111 1111,在+1成1000 0000负数,所以形成无限循环,打印结果如下:
如果是for (unsigned sigchar a = 0; a < 128; ++a)
则打印0~127.
2.数据的隐式转换
(1)基本数据类型的隐式转换
- 表示范围小的赋值给表示范围大的。如果自身有符号数,扩充的是符号数。如果自身没有符号数,扩充的是0。
代码示例:
int main()
{
char a = 5;
char b = -5;
int x = a;
int y = b;
unsigned int z = b;
printf("x=%d y=%d z=%d\n", x, y, z);
printf("x=%x y=%x z=%x\n", x, y, z);
return 0;
}
所以执行结果的十六进制表示如下所示:
以下再给出一些示例:
2. 表示范围大的赋值给表示范围小的,小范围是几字节则从大范围的低地址截取几字节。
#include<stdio.h>
int main()
{
int x = 0x123456A8;
short a = x;
printf("%d", a);
char b = x;
printf("%d", a);
}
所以代码运行结果如下所示:
int main()
{
char ch='a';
int x=0;
x=ch;
x=(int)ch; //在这里进行转换时,ch的类型并不发生转换,而是将ch扩充之后的值存入临时空间给x;
return 0;
}
当不同基本类型数据进行比较时,要进行隐式转换,当两个数据都是char类型或者short int类型时,系统将它们转换成int类型进行比较。
总结:
- 所谓类型相容,指的就是类型不同但系统可以自动进行转换。
- 类型相容只针对基本数据类型,指针,数组,结构体类型,联合体类型,枚举类型,不具此性质。
(3)浮点数的隐式转换
根据国际标准IEEE754(电气和电子工程协会),任意一个二进制浮点数X可以表示成下面的形式:(-1)S*M*2E
- (-1)^s表示符号位,当s=0,X为正数;当s=1,X为负数。
- M表示有效数字,大于等于1,小于2。
- 2E表示指数位。