【问题标题】:How does converting long long to int work?将 long long 转换为 int 如何工作?
【发布时间】:2015-10-30 12:47:01
【问题描述】:
例如我有以下内容:
#include <iostream>
int main()
{
long long a = 2346436346346346;
int b = a;
//int b = static_cast<int>(a) //same result
std::cout << a << "\n" << b;
std::cin.get();
}
输出:
2346436346346346
1223261034
b 采用什么逻辑?
【问题讨论】:
标签:
c++
integer
type-conversion
【解决方案1】:
对有符号整数类型的溢出赋值的结果是实现定义的:
如果目标类型是有符号的,如果它可以在目标类型中表示,则值不变(并且
位域宽度); 否则,该值由实现定义。
(N4140 中的 4.7 第 3 条)
因此,您必须询问提供您的实现的人他们所说的结果是什么,C++ 标准对此没有任何说明。
【解决方案2】:
b 取值的逻辑是什么?
它是实现定义的,在你的情况下,值被截断:
2346436346346346 in binary is:
0000000000001000 0101011000010010 0100100011101001 0111101101101010
1223261034 in binary is:
0100100011101001 0111101101101010
【解决方案3】:
根据标准4.7\p3 积分转换[conv.integral] (Emphasis Mine):
如果目标类型是有符号的,如果可以,则值不变
以目的地类型表示;否则,值为
实现定义