C语言基础数据类型
char 数据类型
C语言中使用关键字 char
来表示字符,char是英文单词character的缩写,中文翻译为字符,一般用来存储ASCII码中的字符.
ASCII码有两种:标准ASCII(128个字符)+ 拓展ASCII(256个字符),只需要使用 8bit
(8位二进制数据)可以表示任意一种,意味着只需要1个存储单元(1字节)。
char 数据类型实际上存放的是一个小于等于255编号的(无符号整数)用来表示字符,这个无符号证书编码被称为ASCII码
如何查看ascii码 1. 百度 2. 使用 man 函数在 Linux系统下输入
man ascii
,按q
退出
'A' --> 65
'a' --> 97
'0' --> 48
char b = 'c' // 99
char c = b + 7; // 99 + 7 0110 0011 + 0000 0111 106 -> "j"
printf("c = %c", b) ; // j
注意:如果使用 sizeof('j')
计算指定字符的内存大小返回值为 4,sizeof
运算符计算给定类型或表达式内存所占字节时,
字符 'j' 他是一个常量,在C语言中就是一个ascii数字 106
, 'j'就被提升成了 int
类型从而返回的是int类型的大小而不是字符的大小。
所以不要使用这种方式计算字符的大小
printf("c 字节 %d \n",sizeof(c)); // 1
printf(" 字节 %d \n",sizeof(char)); // 1
printf("'j' 字节 %d \n",sizeof('j')); // 4
转义字符
概念:
所有的ASCII码都 可以用 \
加数字(一般是8进制数字)来表示。而C中定义了一些字母前加 \
来表示常见的那些不能显示的ASCII字符,如 \0
,\t
,\n
等,\
被称为转义字符,因为后面的字符,都不是它本来的ASCII字符的意思了。它告诉编译器需要用特殊的方式进行处理。
格式一:'\ddd' :ddd代表 1到3位八进制数
printf("%c\n", '\102'); //输出B,因为大写字母B的在ASCII码表中的八进制为 0102
格式二:'\xdd' :dd表示1到2位十六进制数
printf("%c\n", '\x42'); //输出B,因为大写字母B的在ASCII码表中的十六进制为 0x42
以下是一些常见的转义字符
转义字符 | 值 |
---|---|
'\n' | 换行 |
'\t' | 横向跳格(相当于是Tab) |
'\r' | 回车,返回行首 |
'\' | 反斜杠 |
'%%' | % |
练习1: 以下哪些不是字符
"a" 'a' '\t' '\n' '\033' '\0x10'
练习2:
'\41' 转换之后的字符是什么 //!
浮点型
概念:用来表达实数(小数)的数据类型
分类:
- 单精度浮点型(
float
),在64位系统中典型尺寸是4字节,精确到小数点后6位 - 双精度浮点型(
double
),在64位系统中典型尺寸是8字节,精确到小数点后15~16位 - 长双精度浮点型(
long double
),典型尺寸是16字节
浮点型的书写方式
- 十进制形式:指的是数字必须以整数形式+小数形式组成,比如 10.0 、3.14 ......符合规则
- 指数形式:一般数学上对于小数可以以10为底进行表示 比如
3.14 * 10²
,但是在使用英文半角输入法的时候没办法输入上底或者下底,所以C语言规定以字母e
或者E
来表示指数,并且要求字母e
或者E
的前面必须有数字,字母e或者E的后面必须为整数。
#include <stdio.h>
int main(int argc, const char* argv[]) {
// float 占用 4 个字节
float a = 1.2;
printf("%f \n", a);
// double 占用 8 个字节
double b = 1.2;
printf("%lf \n", b);
// long double 占用 16 字节
long double c = 1.2;
printf("%Lf \n", c);
return 0;
}
浮点型底层存储的原理
https://www.hello-algo.com/chapter_data_structure/number_encoding/
特点:提供 浮点型的范围但是牺牲了精度。
0.1 + 0.2 != 0.3 的问题
int main(int argc, const char* argv[]) {
double a = .1;
double b = .2;
double c = a + b;
double d = .3;
printf("%.17f \n ", c); // 0.30000000000000004
printf("%.17f \n ", d); // 0.29999999999999999
printf("%d \n", c == d); // 1
return 0;
}
上面例子中 0.2 + 0.1 != 0.3 就是因为浮点型在底层存储的方式导致的。
整型
表达整数的数据类型
语法:
int number = 15; // 定义一个专门存放整数的数据类型
需要注意的地方:
- int 的本意是 integer,即整数的意思
- int number 代表在内存中开辟一块小区域,称为 number,用来存放整数,number 一般被称为变量。
- 变量 number 所占内存大小,在不同的系统中是不一样的,64位系统典型的大小是4个字节(描述4*8=32位二进制)。
数据类型 | 字节数 | 格式符 | 数据范围 | 最小值宏 | 最大值宏 |
---|---|---|---|---|---|
short(短整型) | 2 | %hd | -2^15^~ 2^15^-1 (-32768 ~ 32767) | SHRT_MIN | SHRT_MAX |
int(整型) | 4 | %d | -2**^31^ ~ 2^31^-1 (-2147483648 ~ 2147483647)** | INT_MIN | INT_MAX |
long(长整型) | 4 | %ld | -2^31^~ 2^31^-1 (-2147483648 ~ 2147483647) | LONG_MIN | LONG_MAX |
long long(长长整型) | 8 | %lld | -2^63^~ 2^63^-1 | LLONG_MIN | LLONG_MAX |
unsigned short(无符号 短整型) | 同 short | %hu | 0~ 2^16^-1 (0 ~ 65535) | 0 | USHRT_MAX |
unsigned int(无符号 整型) | 同 int | %u | 0~ 2^32^-1 (0 ~ 4294967295) | 0 | UINT_MAX |
unsigned long(无符号 长整型) | 同 long | %lu | 0~ 2^32^-1 (0 ~ 4294967295) | 0 | ULONG_MAX |
unsigned long long(无符号 长长整型) | 同 long long | %llu | 0~ 2^64^-1 | 0 | ULLONG_MAX |
由于,C 标准没有具体规定以上各类数据所占用的字节数。因此,在不同系统、编译器下,数据类型占用的字节数会有所不同。
比如:int 类型,在 Turbo C 环境占 2 字节,取值范围与 short 相同。 而在 Visual C 环境下是 4 字节。
再如:long 类型,相同的 gcc 编译器下,在 Windows 系统中占 4 字节,而在 Linux 系统中占 8 字节。
可以使用 sizeof 查看 数据类型 占用内存的大小。
可以引入头文件 #include <limits.h> 借助宏来查看 数据类型 在当前平台上 对应的最小、最大值。
#include <stdio.h>
#include <limits.h>
int main(void)
{
printf("short 大小 = %llu\n", sizeof(short));
printf("short 最小值 = %hd, 最大值 = %hd\n", SHRT_MIN, SHRT_MAX);
printf("unsigned short 最小值 = 0 最大值 = %hu\n", USHRT_MAX);
printf("\n");
printf("int 大小 = %llu\n", sizeof(int));
printf("int 最小值 = %d,最大值 = %d\n", INT_MIN, INT_MAX);
printf("unsigned int 最小值 = 0, 最大值 = %u\n", UINT_MAX);
printf("\n");
printf("long 大小 = %llu\n", sizeof(long));
printf("long 最小值 = %ld, 最大值 = %ld\n", LONG_MIN, LONG_MAX);
printf("unsigned long 最小值 = 0 最大值 = %lu\n", ULONG_MAX);
printf("\n");
printf("long long 大小 = %llu\n", sizeof(long long));
printf("long long 最小值 = %lld, 最大值 = %lld\n", LLONG_MIN, LLONG_MAX);
printf("unsigned long long 最小值 = 0, 最大值 = %llu\n", ULLONG_MAX);
printf("\n");
return 0;
}
整形应该包括:byte 数据类型的,但是 c 语言没有,如果需要使用两中方式
- 使用 char 类型来代替,应为都是一节字节
- 使用 stdint.h 中的 uint_8 来代替 , (底层也是char)
#include <stdio.h>
#include <stdint.h>
int main(){
// byte 一个字节的 ,
// 在 c 语言中默认是没有 byte 数据类型的,一般都是用
unsigned char a = 12;
printf("byte %u \n", sizeof(unsigned char));
printf("bype %u \n", sizeof(a));
// 另一种方式 导入 <stdint.h> 使用该头文件中提供的, uint_t 8 数据类型 , 底层也是用 unsigned char 的
uint8_t b = 12;
printf("bype %u \n", sizeof(b));
// 拓展:stdint.h 中定义堆的数据类型,
// 比如 uint8_t 代表 无符号的byte | uint16_t 代表无符号的:short | uint32_t 代表无符号的 int | uint64_t 代表无符号的 long
// stdint 中定义这些数据,是为了在不同平台下数据占用的字节数是一样的,(适配不同平台)
return 0;
}
bool型
目标:知道 bool 类型两种取值
C语言在设计之初是没有布尔类型的,使用 1 和 0,对应表示真、假。
但,其他编程语言像 C++、java 都设计有布尔数类型。 C语言在1999 年推出的新标准(C99)中,也加入了 布尔类型。**用 true 来代表 1,为真;用 false 来代表 0,为假。**使用时,需要引入头文件 #include <stdbool.h>
#include <stdbool.h>
int main(void)
{
printf("%d, %d\n", true, false); // 1, 0
return 0;
}
虽然语法上与其他语言一致,但 C 语言每次在使用时需先引入头文件,较为麻烦。 因此,一些老 C 工程师还是喜欢直接在程序中用 1 和 0 来表示 真和假。
注意:
- 0 就是 false , 所有非零的数都是 true
- 在 bool 头文件,定义了 true 的值为1 , false 的值为 0