从long long转换为int,另一种转换回c ++

Loe*_*rio 16 c++ int casting long-integer

如何从long long转换为int,另一种转换回c ++?也有长长的特性,特别是它的最大尺寸,谢谢提前..

Kei*_*son 18

int保证至少16位宽.在现代系统中,最常见的是32位(即使在64位系统上).

long long,最初不存在于C++中,保证至少为64位宽.这几乎总是正好 64位宽.

将值从一个整数类型转换为另一个整数类型的常用方法就是分配它.任何必要的转换都将隐式完成.例如:

int x = 42;
long long y = 9223372036854775807;
y = x; // implicitly converts from int to long long
x = y; // implicitly converts from long long to int
Run Code Online (Sandbox Code Playgroud)

对于缩小转换,目标类型不能表示源类型的所有值,存在溢出的风险; int可能会或可能不会保持价值9223372036854775807.在这种情况下,结果是实现定义的.最可能的行为是丢弃高阶位; 例如,转换9223372036854775807int可能会产生2147483647.(这在十六进制中更清楚;值分别为0x7fffffffffffffff0x7fffffff.)

如果需要显式转换,可以使用强制转换.C样式转换使用括号中的类型名称:

(long long)x
Run Code Online (Sandbox Code Playgroud)

或者你可以使用C++风格static_cast:

static_cast<long long>(x)
Run Code Online (Sandbox Code Playgroud)

这比C风格的演员表更安全一些,因为它限制了它可以操作的类型.


Dav*_*vid 13

long long类型通常为64位.

类型int可能是32位,但不是在所有机器上.

如果你将一个int转换为long long,你可以这样做

my_long_long = (long long) my_int
Run Code Online (Sandbox Code Playgroud)

它会没事的.如果你走另一个方向,就像

my_int = (int) my_long_long
Run Code Online (Sandbox Code Playgroud)

并且int小于64位,它将无法保存所有信息,因此结果可能不正确.

  • 它是否只是在转换为较小的尺寸时截断高阶位? (6认同)
  • 反对这一点,因为我相信在编码 C++ 时,像 static_cast 这样的 C++ 类型转换应该总是比 C 样式类型转换更受欢迎。 (5认同)
  • @adu:也许吧.这是典型的行为,但结果是针对签名目标类型的实现定义.对于无符号目标类型,结果由语言定义,相当于丢弃高位. (4认同)
  • @Guinzoo这是大多数程序员在开始使用C ++时的想法。但是请重新考虑:有人可能会重构代码,以使my_int实际上成为指针而不是局部变量(变量名可能不反映这一点)。然后,猜测一下:强制转换仍然成功,但是给您* address *而不是变量的值。使用static_cast,会出现编译器错误。有许多方法可以创建未定义的行为,甚至导致应用程序崩溃,就像这样!让编译器在可能的情况下为您提供帮助-新的C ++强制转换可为您提供帮助,并且根本不冗长! (2认同)