C++ 中文字类型的意义是什么?

Raj*_*dhu 1 c++ literals

我是 C++ 新手,我正在使用 C++ Primer 来学习。

long对我来说,变量具有像和long longfor这样的“子类型”是有意义的int,这样它们就可以容纳更大的值,即使它们是用不太大的值初始化的。

但我似乎无法理解为什么人们可能需要重写整数文字的默认类型,例如42使其long long代替默认类型int?这不像文字必须保存另一个值,因为它实际上是一个常量。

use*_*522 6

当您直接在表达式中使用文字(而不是仅仅使用指定类型初始化变量)时,文字的类型将很重要,因为算术表达式受特定整数类型的影响。

例如:

1 << 32
Run Code Online (Sandbox Code Playgroud)

这里1有类型int,因此,在 32 位宽的系统上int,这将具有未定义的行为:您不能将整数左移超过 w-1,其中w是其宽度。

另一方面

1LL << 32
Run Code Online (Sandbox Code Playgroud)

保证没问题,因为1LL有类型long long并且该类型保证至少为 64 位宽。

类似地,重载决策可以根据操作数/参数的类型选择不同的函数来调用。因此,用作1LL参数而不是1可能会调用具有不同行为的不同重载。

  • "_int a = 123 和 int a = 123LL 一样吗?_": 是(即效果相同) "_And 是 int 范围之外的整数文字的默认类型,例如 12313123123123,自动为 L /LL,取决于它们的范围?_”:几乎是的。这取决于整数文字的类型。有关确切详细信息,请参阅 https://en.cppreference.com/w/cpp/language/integer_literal 中的表格。“_如果没有,那么定义 long a = 123123123123 就没有意义,我们必须使用 long a = 123123123123L,对吧?_”:文字总是有一个可以保存其值的类型,所以这不是一个问题。 (2认同)
  • 不同的是,123LL在赋值给a时(编译时)会被转换为int。而123在赋值给a时不会转换为int,因为它已经是int了。如果忽略差异,那么它们是相同的。 (2认同)
  • @RajdeepSindhu 但是,重要的是要认识到“-”符号不能是整数文字的一部分,因此我的上述声明没有考虑到它。整数文字本身永远不会是负数。因此,“-X”(其中“X”是数字序列)实际上可能具有未定义的行为,因为“X”可能具有可以保存“X”但不能保存其负值的类型。 (2认同)