一:C语言数据类型分类
二:数据类型与内存的关系
字也叫Word 字节也叫Byte 位也叫bit
1个字=2个字节
1个字节=8位
1K=1024B
1M=1024K
1G=1024M
1T=1024G
不同编译器对应的数据类型占内存大小也不同
16位编译器
char :1个字节
char*(即指针变量): 2个字节
short int : 2个字节
int: 2个字节
unsigned int : 2个字节
float: 4个字节
double: 8个字节
long: 4个字节
long long: 8个字节
unsigned long: 4个字节
32位编译器
char :1个字节
char*(即指针变量): 4个字节(32位的寻址空间是2^32, 即32个bit,也就是4个字节。同理64位编译器)
short int : 2个字节int: 4个字节
unsigned int : 4个字节
float: 4个字节
double: 8个字节
long: 4个字节
long long: 8个字节
unsigned long: 4个字节
64位编译器
char :1个字节
char*(即指针变量): 8个字节
short int : 2个字节
int: 4个字节
unsigned int : 4个字节
float: 4个字节
double: 8个字节
long: 8个字节
long long: 8个字节
unsigned long: 8个字节各种数据类型
三:sizeof运算符
此处只讨论sizeof计算数据类型占用内存大小
=>sizeof是个单目运算符,用来计算操作数在内存中占据的字节数,其操作数既可以是括在圆括号中的类型标识符,其返回值是size_t类型,即无符号整数
=>sizeof的结果与系统有关
如:不同编译器下 sizeof(int)得到的结构不同
=>sizeof是运算符,不是函数
=>sizeof(结构体/共用体),求得的大小与内存对齐有关,可以用#pramga pack(x),指定结构体内存对齐大小。
sizeof与strlen区别注意点(简单归纳):
strlen()是库函数,()中必须是字符串指针或字符串常量,它返回的是检测对象中第一个'\0'前的字符个数,不含'\0'。
sizeof是操作符,不是函数。它后面的()并不是必须的,没有歧意时就不必写上了。sizeof操作符计算的是系统为它后面的变量或类型名分配的空间大小,无论其中是否存储了有用数据。
四:数值存储方法
在计算机的数值存储世界里面,采用0和1存储。
讨论部分内容,正负符号作用、原码、反码、补码、unsigned类型、大端/小端存储。
正负符号作用
整数的正负——有符号和无符号。正数和负数是两种情况,要区分两种情况,
用二进制的一位刚好可以表示,比如用0表示正数,1表示负数。
C语言中确实就是用最高位来表示一个整数的正负号,0表示为正,1表示为负。
原码、反码、补码
概述:
数值的表示方法——原码、反码和补码
原码:最高位为符号位,其余各位为数值本身的绝对值
反码:
正数:反码与原码相同
负数:符号位为1,其余位对原码取反
补码:
正数:原码、反码、补码相同
负数:最高位为1,其余位为原码取反,再对整个数加1
采用原码表示法简单易懂,但它的最大缺点是加法运算复杂。这是因为,当两数相加时,如果是同号则数值相加;如果是异号,则要进行减法。而在进行减法时还要比较绝对值的大小,然后大数减去小数,最后还要给结果选择符号。为了解决这些矛盾,人们找到了补码表示法。
例:
int main(void)
{
int x = -1;
printf(“x1 = %x/n”, x);
printf(“x2 = %u/n”, x);
printf(“x3 = %d/n”, x);
return 0;
}
-1以补码的形式存储,即在32位编译器下:1111 1111 1111 1111 1111 1111 1111 1111
代表-1;打印结果: x1 = 0xffffffff x2 = 4294967295 x3 = -1;%u按照无符号来解析,没有符号位,所以32位全部为数据;%d按照有符号来解析,第一位为符号位,剩下31为数据位;
unsigned类型
整型的每一种都分有无符号(unsigned)和有符号(signed)两种类型(float和double总是带符号的),在默认情况下声明的整型变量都是有符号的类型(char有点特别),如果需声明无符号类型的话就需要在类型前加上unsigned。无符号版本和有符号版本的区别就是无符号类型能保存2倍于有符号类型的正整数数据,比如16位系统中一个int能存储的数据的范围为-32768~32767,而unsigned能存储的数据范围则是0~65535。由于在计算机中,整数是以补码形式存放的。根据最高位的不同,如果是1,有符号数的话就是负数;如果是无符号数,则都解释为正数。另外,unsigned若省略后一个关键字,大多数编译器都会认为是unsigned int。
大端存储、小端存储
所谓的大端模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;
所谓的小端模式,是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中。
至于为什么会有大端小端存储方式不同的原因在这个不进行讲解。
五:浮点型
浮点型常量有两种表示形式:十进制小数形式和指数形式。
实型常量的类型细分:默认为double型,例如3.14就是double类型, 后面加f或F认为是float型,例如3.14f就是float类型
float和double的区别:
float型数据占用4个字节(32bits)存储单元,提供的有效数字是6~7位;
double型数据占用8个字节(64bits)存储单元,提供的有效数字是15~16位。
类型自动转换
混合类型进行计算的时候
低字节类型向高字节类型转换,极限范围小的向极限范围大的转换
赋值的时候进行自动类型转换
赋值号会将右边的表达式转换成左边的类型。大数据会被转成小数据,小数据也会被转成 大数据