← 返回 C++ 学习记录

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”。

十六进制只是数值的表示方式,不能绕过类型范围。也不要为了解决输出异常随意添加强制转换。

规则核对:整数常量、整数转换。

返回全部学习记录 ↗