基本数据类型
六大基本数据类型:short、int、long、float、double、char
整数形(定点型)
C语言标准并没有明确给出每种整形的具体大小,它仅仅给出了一个大小关系的建议。
sizeof(short)<=sizeof(int)<=sizeof(long)<=sizeof(long long)
1、无符号整形unsigned
表示大于等于0的正整数
类型名称 | 字节数 | 取值范围 |
unsigned short无符号短整型 | 2 | 0~2^16-1 (0~65535) |
unsigned int无符号整形 | 4 | 0~2^32-1 (0~4294967295) |
unsigned long无符号长整型 | 4 | 0~2^32-1 (0~4294967295) |
unsigned long long无符号长长整形 | 8 | 0~2^64-1 (0~18446744073709551615) |
-
无符号整形的存储
- 直接以数值的二进制形式存储。
- 从低位开始按位放入内存中,高位空余补0。
- 例如:
unsigned short age = 18;
1、18-->10010(二进制)
2、0000 0000 0001 0010
2、有符号整形signed
类型名称 | 字节数 | 取值范围 |
short短整型 | 2 | -2^15~2^15-1 |
int整形 | 4 | -2^31~2^31-1 |
long长整型 | 4 | -2^31~2^31-1 |
long long长长整形 | 8 | -2^63~2^63-1 |
-
有符号整形在内存中的存储
- 以补码的形式进行存储,可以通过补码形式用加法代替减法。
- C语言整形中,某个整形数据类型的最大值+1变为最小值,最小值+1变为最大值,这种现象成为整形数值溢出。
- 存储的值相当于一个环(此为补码),0000 0000~0111 1111为0到最大值(+127);最大值加1为1000 0000是最小负数值,1000 0000(最小负数值-128)~ 1111 1111(最大负数值-1)。
- 原码:最高位为符号位,0代表正整数,1代表负整数。除符号位以外为数据位,存储数的绝对值的二进制形式。
- 反码:
- 正整数:原码本身
- 负整数:符号位不变,数据位取反。
- 补码:
- 正整数:原码本身
- 反码+1
- 例如:
原码:0111 1111(+127) 1111 1111(-127) 1000 0000(0)
反码:0111 1111(+127) 1000 0000(-127) 1111 1111(0)
补码:0111 1111(+127)
1000 0000(-128) 1000 0001(-127) 1111 1111(-1) 0000 0000(0)
short age = 18
0000 0000 0001 0010(正整数,原反补相同)
short a = -18
1000 0000 0001 0010(原码)
1111 1111 1110 1101(反码)
1111 1111 1110 1110(补码)
short a = 1, b = -1;
a+b = 0
a:0000 0000 0000 0001(补码)
b:1111 1111 1111 1111(补码)
a+b:1 0000 0000 0000 0000
浮点数类型(实数型)
C语言标准给出的建议:sizeof(float)<=sizeof(double)<=sizeof(long double)
类型名称 | 字节数 |
float单精度浮点数类型 | 4 |
double双精度浮点数类型 | 8 |
long double长双精度浮点数类型 | 8 |
- 浮点数的存储 IEEE-754标准(1985年提出)
- 浮点数类型无法做到精确存储!
- 十进制小数转二进制时,极大概率转换不尽。
- 尾码在存储时要进行截断,舍弃一部分精度。
- 浮点数类型只能在限定的范围内做到近似存储。
- float仅能在6-7位数中做到近似存储(尽量保证精度)
- 例子
- 浮点数类型无法做到精确存储!
- -------- -----------------------
(符号位1) (阶码8) (尾码23)
float存储4.25(十进制)
0 1000 0001 0001 0000 0000 0000 0000 000
1、将十进制小数转为二进制
4.25(十进制)--> 100.01(二进制)
2、将二进制小数转为科学计数法形式
100.01 -> 1.0001 * 2^2
3、求阶码,阶码 = 2+127=129
4、求尾码,尾码 = 0001
字符型
ASCII表:
48~57:0~9
65~90:A~Z
97~122:a~z
- 字节数:1
- char类型变量具有双重性:可以把它解释为一个字符,也可以解释为一个整数,实际的代码值取决于计算机环境。因此char类型的值可以算术运算中使用。
- 例如:
char character = 74 //表示整数74,或者字符'J'
char letter = 'C' //表示整数67,或字符'C'
letter = letter + 3 //表示整数70,或字符'F'
常量和字面值
-
const修饰变量:只读变量,常变量(常量)
- const修饰的变量为只读变量,其值不允许发生修改。
- 被const修饰的变量,不允许进行赋值。
- 被const修饰的变量,必须进行初始化。
-
字面值
- 整形字面值
- 默认数据类型为int
- 改变字面值类型:在字面值后面加后缀
- U:unsigned
- L:long
- 整形字面值无法表示short短整型
- 字面值无法表示二进制
- 十六进制字面值不区分大小写0x1F、0X1F
- 例子:
- 12L(long)
- 12LL(long long)
- 12U(unsigned int)
- 12ULL(unsigned long long)
- 12,-12(int)
- 0x12(int十六进制整数)
- 012(int八进制整数)
- 浮点数类型字面值
- 默认类型为double
- 改变字面值类型:在字面值后面加后缀
- F:float
- L:long
- 例子:
- 3.14L(long double)
- 3.14F(float)
- 3.14(double)
- 3.(double 3.0)
- .24(double 0.24)
- 1.23E-2:(double 1.23*10^-2=0.0123)
- 1e-6:(double 1*10^-6)
- 字符型字面值
- 数据类型为char类型
- 需用单引号引起来,仅能表示一个ASCII码表字符
- 特殊字符,用\进行转义
- '\n':换行符
- '\t':制表符
- '\'':单引号
- '\"':双引号
- '\r':回车符
- '\a':响铃符
- '\ddd':通过3位八进制数,表示某个字符
- '\101':'A'
- '\061':'1'
- '\xhh':通过2位十六进制数,表示某个字符
- '\x61'(97):'a'
- 字符串字面值
- 使用双引号引起来
- 末尾自动添加结束符(‘\0’,ASCII码是0)
- 字符个数:字符串字面值一共包含的字符数量
- 字符串长度:字符串中第一个'\0'之前的字符数量
- “Hello World”:字符个数:12 字符串长度:11
- “”:空字符串 字符个数:1 字符串长度:0
- “a\x61b” :字符个数:4 字符串长度:3
- “a\0b”:字符个数:4 字符串长度:1
- “a\061b”:字符个数:4 字符串长度:3
- 两个字符串字面值相邻时,会自动拼接到一起。"ab""cd":"abcd" 字符个数:5 字符串长度:4
- 整形字面值
关键字(保留字)
是整个语言范围内预先保留的标识符,如int、long、short、unsigned、char、float、double、void等。
标识符
用户编程时使用的名字,用于给变量、常量、函数、语句块等命名,以建立起名称与使用之间的关系。