基础数据类型
2024年12月25日大约 5 分钟
数据类型对应的范围
- bit:位(1个二进制位),计算机储存的最小单位
- Byte:字节(8个连续的二进制位),计算机储存的基本单位
B(Byte) = bit KB(KiB) = B( B) MB(MiB) = KB GB(GiB) = MB TB(TiB) = GB PB(PiB) = TB
数据类型名 | 内容(一般情况) | 占用内存大小 | 能储存的范围 | scanf /printf 标识符(g++) |
---|---|---|---|---|
int /signed | 32 位整数 | 4 Bytes | 约 | %d /%d |
long long | 64 位整数 | 8 Bytes | 约 | %lld /%lld |
char | 字符 | 1 Byte | 至少能储存 常见范围为 | %c /%c |
float | 单精度浮点数 | 4 Bytes | 有效数字 | %f /%f |
double | 双精度浮点数 | 8 Bytes | 有效数字 | %lf /%f |
unsigned int | 无符号 32 位整数 | 4 Bytes | 约 | %u /%u |
unsigned long long | 无符号 64 位整数 | 8 Bytes | 约 | %llu /%llu |
整数编码
基础二进制
- 二进制即要求满二进一,因此每一位为
或 - 二进制从最低位到最高位,数位的权值分别为:
- 即
转换成十进制结果如下
原始数位: 1 0 1 1 0 1
对应权值:32 16 8 4 2 1
转十进制:32 + 8 + 4 + 1 = 45
原码、反码、补码
- 原码
- 最高位为符号位,正数为
,负数为 。 - 剩下位置为原数绝对值的二进制。
- 最高位为符号位,正数为
- 反码
- 正数反码与原码一致。
- 负数反码除最高位之外,在原码基础上取反。
- 补码
- 正数补码与原码一致
- 负数补码在反码基础上加
。
讨厌的浮点数
保留 位小数
方法 1
- 头文件:
#include <cstdio>
(<bits/stdc++.h>
包含了这个头文件) - 语句:
printf("%.xf", a);
方法 2(推荐)
- 头文件:
#include<iostream>
、#include<iomanip>
(<bits/stdc++.h>
包含了这两个头文件) - 语句:
cout << fixed << setprecision(x) << a;
关于四舍五入
如果题目说保留
但是需要注意的是,这种方式并不是我们直观中的四舍五入。
对于
如果是 double
类型可以精确储存的数,那么会舍入到最接近的偶数数位,比如在保留
-> -> -> ->
保留
-> ->
如果是 double
类型无法无法精确储存的数,实际上储存的数可能会有一点点偏差,也会造成和我们所想不同。
比如如果输入
现在的出题人一般都不会说四舍五入,而是用精度控制,比如相对或绝对误差在
字符与整数的对应转换
char c;
int a;
数字字符与对应整数
'0' ~ '9'
对应的 ASCII 为48 ~ 57
- 数字字符转换为对应整数:
(int)(c - '0')
- 数字转换为对应字符:
(char)(a + '0')
大小写字母映射到
'a' ~ 'z'
对应的 ASCII 为97 ~ 122
'A' ~ 'Z'
对应的 ASCII 为65 ~ 90
- 大写字母映射到
:(int)(c - 'A')
- 小写字母映射到
:(int)(c - 'a')
大小写字母之间转换
- 大写转小写:
(char)(c - 'A' + 'a')
- 小写转大写:
(char)(c - 'a' + 'A')
其他常见基础操作
数位分解
% 10
:取出个位/ 10
:去掉个位- 个位:
a % 10
- 十位:
a / 10 % 10
- 百位:
a / 100 % 10
- 千位:
a / 1000 % 10
闰年判断
- 普通闰年:
y % 4 == 0 && y % 100 != 0
- 世纪闰年:
y % 400 == 0
- 闰年判断:
(y % 4 == 0 && y % 100 != 0) || y % 400 == 0
- 因为
&&
优先级高于||
,所以不写那个小括号也可以。
- 因为
三角形判断
任意两边之和大于第三边。
a + b > c && a + c > b && b + c > a
上下取整
int p, q, x;
,这里我们只讨论
- 下取整(
)x = p / q
- 上取整(
)if (p % q == 0) x = p / q; else x = p / q + 1;
x = (p + (q - 1)) / q;
x = p / q + (p % q != 0);
类型转换
- 用一个目标类型的数参与运算(必须是更优先的类型):
1.0 * a
1LL * a
(默认情况下1
为int
类型,在后面加上ll
或LL
可以得到一个long long
类型的1
)
- 存入一个目标类型的变量:
char c = 'a' - 32;
- 用
(type)
前缀,这个前缀会把紧跟着的数变为type
类型。(double)p / q
(char)('a' - 32)