变量类型,运算符优先级¶
前置知识¶
无
目标¶
- 占几个字节,占多少位的问题
- unsigned int,你是否见过 unsigned
- 常用的ASCII码,char 其实是特殊的整数类型
- 运算符优先级,如果你分不清 x = (x | x << 2) & 0x33 计算顺序
占几个字节,占多少位¶
int类型,4字节,32位
short类型,2字节,16位
char类型,1字节,8位
bool类型,1个字节,8位
由于历史原因,C++ 中布尔类型和字符类型会被视作特殊的整型。
整数类型一般按位宽有 5 个梯度:char, short, int, long, long long
char,8位
short,16位
int,32位
long,32位
long long,64位
字符类型,char,signed char,unsigned char
实际上底层存储方式仍然是整数,一般通过 ASCII 编码 实现字符与整数的一一对应
一般来说 signed char,unsigned char 不应用来存储字符,绝大多数情况下,这两种类型均被视作整数类型。
C++17 起在 <limits> 中提供了 std::numeric_limits 类模板
std::numeric_limits<int32_t>::max(); // int32_t 的最大值, 2'147'483'647
float,单精度浮点数,精度位数6~9位
double,双精度浮点数,精度位数15~17位
注:写代码时,一般使用double
int double string 之间的转换¶
// string 转换成 int
string s = "1234";
int x = stoi(s);
// C 风格字符串(C-string)转换成 double
scanf("%s", s);
double x = atof(s);
// Parses the C-string str interpreting its content as an integral number, which is returned as a value of type int.
int x = atoi(s);
ASCII码¶
ASCII码是美国信息交换标准委员会制定的 7 位二进制码,共有128个字符。
ASCII码由7个二进制位组成,为了提高信息传输的可靠性,通常增加一个校验位。这样,一个字符就可以用 8 位二进制代码表示了。
主要的需要记忆的ASCII码:
'a' 97
'A' 65
'0' 48
'=' 32
运算符优先级¶
简要记忆,由高到低,分别是
- 乘除模运算
*, /, %
- 加减
+, -
- 左移 右移
<<, >>
- 比较大小
<, >, ==, !=
- 按位与
&
- 按位异或
^
- 按位或
|
- 逻辑与
&&
- 逻辑或
||
写代码时,建议加括号保证运算顺序的正确性。
unsigned 和 unsigned int 有什么区别¶
疑问,源于CSP-J 2019年初赛,这道试题的第8行代码
unsigned a[maxn];
这是什么东西,不是unsigned int, unsigned char, unsigned short吗?
官方写错了,不能够啊。肯定是自己无知了。
原来,unsigned 自己独立使用的时候,就是unsigned int。破案
参考¶
- https://learn.microsoft.com/en-us/cpp/cpp/cpp-built-in-operators-precedence-and-associativity?view=msvc-170,C++ built-in operators, precedence, and associativity(完整的运算符优先级列表)
- https://oi-wiki.org/lang/var/#%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B,OI Wiki
- https://stackoverflow.com/questions/7176657/difference-between-unsigned-and-unsigned-int-in-c