数据类型
基本数据类型:char,short,int,long,float,double
复合数据类型:数组,结构体,共用体,类(C语言没有类型,C++有)
1.1、内存占用与sizeof运算符
变量存储在内存中,需要占用一定的内存空间。计算机存储数据都是以补码的形式来进行存储的。一个变量占用多少空间是由变量的数据类型决定的。每种数据类型,在不同的机器平台上占用内存是不同的。我们一般讲的时候都是以32位CPU为默认硬件平台来描述:
char 1字节 8位
short 2字节 16位
int 4字节 32位
long 4字节 32位
float 4字节
double 8字节
1.2、有符号数和无符号数
1、对于char short int long等整形类型的数,都分有符号有无符号数。
2、而对于float和double这种浮点型数来说,只有有符号数,没有无符号数。
3、对于有符号数和无符号数来说,存储方式不同的。譬如对于char来说unsigned char无符号数,8位(1字节)全部用来存数的内容 ,而无符号数的补码就是原码。所以表示的数的范围是0(补码:为0000 0000) ~ 255(补码为:1111 1111)。
4、signed char表示有符号数,8位中最高位用来存符号(0表示正数,1表示负数),剩余的7位用来存数据。所以可以表示的数的范围是 -128~127(补码为:0111 1111)。==对于正数,补码和原码相同。-128(补码是1 1000 0000)。但是是8位,所以最前面的那个1溢出了,直接丢弃。
1.3、整形数和浮点型数存储方式
对于float和double这种浮点类型的数,它在内存中的存储方式和整形数不一样。所以float和int相比,虽然都是4字节,但是在内存中存储的方式完全不同。所以同一个4字节的内存,如果存储时是按照int存放的,取的时候一定要按照int型方式去取。如果存的时候和取的时候理解的方式不同,那数据就完全错了。
#include <stdio.h>
int main(void)
{
int a = 123;
printf("%f\n",a);//将int类型以float形式取出来进行输出。
return 0;
}
0.000000
总结:存取方式上主要有两种,一种是整形一种是浮点型,这两种存取方式完全不同,没有任何关联,所以是绝对不能随意改变一个变量的存取方式。在整形和浮点型之内,譬如说4种整形char、short、int、long只是范围大小不同而已,存储方式是一模一样的。float和double存储原理是相同的,方式上有差异,导致了能表示的浮点型的范围和精度不同。
#include <stdio.h>
int main(void)
{
int a = 123;
float b = a; //将a里面的数取出来以float形式存储
printf("%f\n",b);
return 0;
}
123.000000
1.4、数据类型转换
不同类型的数据进行运算时,需要转化为同一类型,才进行运算。
1.4.1、隐式转换
代码①:
#include <stdio.h>
int main(void)
{
int a = 3;
float b = 3.5;
printf("a+b = %f\n",a+b);
printf("a+b = %d\n",a+b);//a+b是flaot类型,不能以整型取出(什么方式存储,什么方式取出)
printf("a = %f\n",a);//什么方式存储,什么方式取出
printf("a = %d\n",a);
return 0;
}
a+b = 6.500000
a+b = 0
a = 0.000000
a = 3
- 由输出可知:int类型和float类型进行运算时,运算的过程中int类型a会自动转换为float类型的临时变量f1,然后l临时变量f1在和float类型b进行运算。生成一个临时变量float类型f2,最后由%f取出进行输出。
- 由printf(“a = %f\n”,a);可以得出,int类型a转换为临时float类型f1。其实是将a变量里面的值取出来,放在一个float类型的变量中,而a中的变量还是int类型。
代码②:
#include <stdio.h>
int main(void)
{
int a = 3;
float b = 3.5;
int c;
c = a+b;
printf("c = %d\n",c);
return 0;
}
c = 6
- 由输出可知:int类型a先转换为float临时变量f1,然后在和float变量b进行运算,生成一个临时变量f2。将这个临时变量f2的值取出来赋给int类型的变量c,最后由%d取出进行输出。
1.4.2、强制转换
#include <stdio.h>
int main(void)
{
int a = 3;
float b = 3.5;
printf("a+b=%d\n",(int)(a+b));
return 0;
}
a+b=6
- a+b运算生成的本来是float类型的临时变量f2,然后通过强制类型转换为int类型,最后由%d取出进行输出