一、数据类型分类
基本数据类型(内置数据类型:编译器自带的类型):int、short、long、long long[c99版本提出]、char、float、double
复合数据类型(多个内置类型组成的新类型):数值、结构体[struct]、共用体[union]、枚举[enum]
void类型:void * (万能指针):可以接受任意类型指针的值——可以用来实现C语言的多态
二、定义变量(注意事项:编码规范)
1.变量的可读性(例:int sum_result,看到变量就大概知道它的意义)
C语言命名:形容词_名词(小写,不能用拼音命名)
2.一般变量不要用单个字母,循环变量可以用单个字母
三、基本数据类型需掌握的知识点
1.各种数据类型的字节长度(变量占用内存的大小:字节)
计算机表示内存大小的单位:位[ bit ]、字节 [ Byte ]、半字[ half word ]、字[ word ]、双字、千字节[ KB ]、兆[ MB ]、千兆[ G/GB ]、千千兆[ T/TB ]
各内存单位之间的换算
1 字节 = 8 位,16位 = 2个字节 = 半字,32位 = 4个字节 = 1字,64位 = 8个字节 = 双字,
1024 KB = 1 MB,1024 MB = 1 GB,1024 GB = 1 TB
1 KB = 1024 Byte(字节) = 8*1024 bit
如何测量数据类型的大小?
使用sizeof( )。sizeof( )计算数据类型和变量的内存大小。sizeof( )是运算符不是函数,返回的是一个无符号的长整型。
不同编译器下基本数据类型大小不一样。
//可以使用以下代码进行测试
#include<stdio.h>
int main()
{
printf("int = %ld", sizeof(int));
printf("char = %ld", sizeof(char));
printf("short = %ld", sizeof(short));
printf("long = %ld", sizeof(long));
printf("float = %ld", sizeof(float));
printf("double = %ld", sizeof(double));
return 0;
}
指针的长度:8个字节(固定长度,无论什么类型的指针)
原因:指针是保存地址的,操作系统中地址的长度是固定的,是由操作系统位数决定,64位系统是8个字节,32位系统是4个字节
数组的长度:数据长度 × 元素类型的长度
字符串的长度:用strlen( )来测量,用sizeof( )无法测量。
strlen( )统计字符串中字符的个数。
例:int strlen(char *src),不统计字符串的"\0"。
//以下代码可以看出sizeof()和strlen()的区别
char *ptr = "hello world";
printf("sizeof(ptr) = %ld\n",sizeof(ptr)); //测量的是ptr指针变量的结果
printf("strlen(ptr) = %ld\n",strlen(ptr));
结果:
sizeof(ptr) = 8
strlen(ptr) = 11
四、各种数据类型的取值范围
注:以下都以8位进行举例
计算机是以补码形式保存数据。这样是为了解决“+0”和“-0”问题,数学没有“+0”和“-0”。
计算机有三种码:原码、反码、补码。
计算机内保存一个数是保存的是补码
正数:
原码 = 补码
负数:
补码 = 原码取反 + 1
原码 = 补码取反[符号不变] + 1(计算机不做减法,只做加法)
无符号类型的取值范围
所以unsigned char的最小值为0,最大值为255。
最大值计算有简便方法:在末尾位加一,使其变成100000000,算出结果后减一,所以其结果为2^8 - 1 = 255
有符号的不可以用以上方法计算。
有符号类型的取值范围
signed char取值范围:-128 ~ 127
正数:
0 000 0000 = 0
0 111 1111 = 127
负数:
1 000 0000
取反 111 1111
加一 +1
结果:2^7=128,加上符号位就是 -128
1 111 1111
取反 000 0000
加一 +1
结果:1 * 2^0 = 0,加上符号位就是 -1
综合以上:signed char取值范围为 -128 ~ 127