C++ JOURNAL / 基础语法
变量、整数范围与类型转换
char 与 int、long long 与后缀,以及大整数转换时的疑问。
按我的学习记录整理 · 示例用于帮助理解这篇记录里
我接触过的类型
int:整数。long long:能容纳更大范围的整数(至少 64 位)。double:浮点数,通常用于带小数的计算。char:一个字符。string:字符串,使用时包含<string>。
使用变量前先给它确定的值,或成功读入输入,不要读取未初始化的局部整数。
'a' 和 97 不是同一种类型
'a' 是字符,97 是整数。在常见 ASCII 兼容环境中,字符 a 的编码是 97,但这不是所有字符编码环境的统一规定。
#include <iostream>
using namespace std;
int main() {
char ch = 'a';
int number = 97;
cout << ch << " " << number << endl;
return 0;
}
我问过
cin >> (char)a;。这不是有效的按字符输入写法:强制转换得到的是一个临时的值,不能作为这里接收输入的字符变量。
应当先读进一个真正的 char 变量:
#include <iostream>
using namespace std;
int main() {
char ch;
cin >> ch;
int a = (int)ch;
cout << ch << " " << a << endl;
return 0;
}
(type)value 表示将一个值转换成指定类型。(char)a 不会把变量 a 本身的类型永久改成 char。
long long 和 L、LL
如果已经定义了 long long,是不是就可以不写 L?
long long 是变量类型;L 是整数常量的后缀,两者不是一回事。L 表示从 long 类型开始选择,十进制常量放不下时可使用 long long;LL 明确使用 long long。
#include <iostream>
using namespace std;
int main() {
long long a = 10000000000;
long long b = 10000000000L;
long long c = 10000000000LL;
cout << a << " " << b << " " << c << endl;
cout << 1LL * 100000 * 100000 << endl;
return 0;
}
这里没有后缀的十进制大整数,会依次选择能容纳它的 int、long、long long。所以这几个赋值都可以。
但 long long result = 100000 * 100000; 不能靠左边的 long long 保证安全:右边可能已经在 int 运算中溢出。先写成 1LL * 100000 * 100000,让乘法从较大的类型开始。
signed、unsigned 与 0xFFFFFFFF
signed 表示有符号,可以表示负数;unsigned int 是无符号整数。在常见的 32 位 int 环境下:
- int:−2147483648 到 2147483647。
- unsigned int:0 到 4294967295。
0xFFFFFFFF的数值是 4294967295,通常是 unsigned int 类型。
long long b = 0xFFFFFFFF; 可以保存这个数;随后 (int)b 缩小范围,不能指望数值仍然保持不变。在常见的 32 位 int 环境中可能看到 −1。具体规则和结果与类型宽度、语言版本有关,不能记成“大整数强转 int 都等于 −1”。
十六进制只是数值的表示方式,不能绕过类型范围。也不要为了解决输出异常随意添加强制转换。