一, C 语言的类型
整数: char,short,int,long,longlong
浮点型: float,double,long double
逻辑: bool
指针
自定义类型
类型有何不同
类型名称: int,long,double
输入输出的格式化:%d,%ld,%lf
所表达的数的范围: char<short<int<float<double
内存所占的大小: 1 个字节到 16 个字节
内存中的表达形式: 二进制 (补码), 编码
sizeof
是一个运算符, 给出某个类型或变量在内存中所占据的字节数,
是一个静态运算符, 它的结果在编译的时候就决定了, 不要在 sizeof 的括号中做运算
- sizeof(int)
- sizeof(i)
- #include <stdio.h>
- int main()
- {
- int a;
- a = 6;
- printf("sizeof(int)=%ld\n", sizeof(int));
- printf("sizeof(double)=%ld\n", sizeof(double));
- printf("sizeof(a)=%ld\n", sizeof(a));
- return 0;
- }
- //sizeof(int)=4
- //sizeof(double)=8
- //sizeof(a)=4
二, 整数类型
char:1 字节 (8 比特)
short:2 字节
int: 取决于编译器 (CPU), 通常是意义上的 1 个字
long: 取决于编译器 (CPU), 通常是意义上的 1 个字
longlong :8 字节
整数内部表达
计算机内部一切都是二进制
- 18 ------> 00010010
- 0 ------> 000000
- -18 ------> ?
负数以原码的补码形式表达
反码:
正数的反码与原码相同, 负数的反码为对该数的原码除符号位外各位取反 [每一位取反 (除符号位)]. 取反操作指: 原为 1, 得 0; 原为 0, 得 1.(1 变 0; 0 变 1)
补码:
补码 = 反码 + 1
这里用 - 1 来进行举例子
二进制: 00000001 (1)
反码: 11111110
补码: 11111111
所以 - 1 在计算机里用二进制表达就是全 1
总结:
正数的反码和补码都与原码相同
负数的反码为对该数的原码除符号位外各位取反
负数的补码为对该数的原码除符号位外各位取反, 然后在最后一位加 1
整数的范围
对于一个字节 (8 位), 可以表示: 00000000-11111111
其中:
- 00000000 ------> 0
- 11111111 ~~~ 10000000 ------> -1 ~~ -128
- 00000001 ~~~ 01111111 ------> 1 ~ 127
char :1 字节:-128~127
short:2 字节:-32768~32767
int: 取决于编译器 (CPU), 通常的意义是 "1 个字"
long:4 字节
longlong:8 字节
unsigned
如果一个常量想要表达自己是 unsigned, 可以在后面加一个 U 或者 u
用 L 或者 l 表示 long
unsigned 的初衷并非扩展数能表达的范围, 而是为了做纯二进制运算, 主要是移位
- #include <stdio.h>
- int main()
- {
- unsigned char c = 255;
- int i = 255;
- printf("c=%d,i=%d\n", c , i);
- // c=-1,i=255
- // 当使用了 unsigned 之后 c=255,i=255
- return 0;
- }
整数越界
整数是以纯二进制方式进行计算的, 所以
- 11111111 + 1 ------> 100000000 ------> 0
- 01111111 + 1 ------> 10000000 ------> -128
- 10000000 - 1 ------> 01111111 ------> 127
也就是在计算机中 127 + 1 = -128,-128 -1 = 127
- char a = 127;
- char b = -128;
- char c = a + 1;
- char d = b - 1;
- printf("%d, %d\n", c , d );
- // -128, 127
如图所示: 顺时针为减, 逆时针为加
整数的输入和输出
只有两种形式: int 或者 long long
- %d:int
- %u:unsigned
- %ld:long long
- %lu:unsigned long long
8 进制和 16 进制
一个以 0 开始的数字字面量是 8 进制
一个以 0x 开始的数字字面量是 16 进制
%o 用于 8 进制,%x 用于 16 进制
8 进制和 16 进制只是如何把数字表达为字符串, 与内部如何表达数字无关
- char c = 012;
- int i = 0x12;
- printf("c=%d, i=%d\n", c,i);
- printf("c=0%o, i=0x%x\n", c,i);
- // c=10, i=18
- // c=012, i=0x12
选择整数类型
没有特别的需要, 就选择 int
三, 浮点类型
类型 | 字长 | 范围 | 有效数字 |
---|---|---|---|
float | 32 | 7 | |
double | 64 | 15 |
输入和输出
类型 | scanf | printf |
---|---|---|
float | %f | %f、%e |
double | %lf | %f、%e |
其中 %e 是科学计数法
- #include <stdio.h>
- int main()
- {
- double a = 12.321;
- printf("%e\n", a );
- //1.232100e+001
- return 0;
- }
输出精度
在 % 和 f 之间加上. n 可以指定输出小数点后几位, 这样的输出是做 4 舍 5 入的
超出范围的浮点数
printf 输出 inf 表示超出范围的浮点数:+∞,-∞
printf 输出 nan 表示不存在的浮点数
浮点运算的精度
- float a , b , c ;
- a = 1.345f;
- b = 1.123f;
- if (c == 2.468)
- {
- printf("相等 \ n");
- }else
- {
- printf("不相等 \ n");
- }
- // 不相等
带小数点的字面量是 double 而不是 float
float 需要用 f 或者 F 后缀来表明身份
选择浮点类型
没有特殊的需要直接用 double
字符类型
char 是一种整数, 也是一种特殊的类型: 字符
用单引号表示的字符字面量:'a' , '1'
printf 和 scanf 里用 %c 来输入输出字符
- char c;
- c = '1';
- printf("%d\n", c); // 49 ascll
- printf("%c\n", c); // 1
逃逸字符
用来表达无法打印出来的控制字符或者特殊字符, 它是由一个反斜杠 ? 开头, 后面跟上另一个字符 , 然后组成一个字符
printf("请输入身高和体重, 如果输入 \"170 80\"表示 170cm 和 80kg\n");
\b : 回退一格 ,\t : 到下一个表格位
\n : 换行 , \r: 回车
": 双引号 ,': 单引号
\ : 反斜杠本身
自动类型转换
当运算的两边出现不一致的类型时, 就会出现类型的自动转换, 自动转化为较大的类型
对于 printf, 任何小于 int 的类型会被转换为 int,float 会被转换成 double
但是 scanf 不会, 要输入 short, 需要 %hd
强制类型转换
(类型) 值
例如:(int)10.2
强制类型转换的优先级高于四则运算符
- bool
- include <stdbool.h>
然后就可以使用 bool 和 true,false
- #include <stdio.h>
- #include <stdbool.h>
- int main()
- {
- bool b = 6> 5;
- bool t = true;
- printf("%d\n", b);
- // 1
- return 0;
- }
四, 逻辑运算符
逻辑运算符是对逻辑的运算, 结果只有 0 或者 1
运算符 | 描述 | 示例 | 结果 |
---|---|---|---|
! | 逻辑非 | !a | |
&& | 逻辑与 | a && b | |
|| | 逻辑或 | a||b |
优先级
如图所示:
短路
逻辑运算符是自左向右进行的, 如果左边的结果已经能决定结果了, 就不会做右边的计算
对于 &&, 左边是 false 时就不做右边了
对于 ||, 左边是 true 时就不做右边了
条件运算符
count = (count> 20) ? count - 10 : count + 10;
条件, 条件满足时的值, 条件不满足的值
逗号运算
- int i,j;
- i = 3+4,5+6;
- j = (3+4,5+6);
- printf("%d\n", i);
- printf("%d\n", j);
- // 7
- // 11
当有括号时, 计算的是第二个表达式
来源: http://www.bubuko.com/infodetail-3215907.html