static_cast <int>(long long)安全吗?

时间:2016-09-25 05:41:14

标签: c++ casting

static_cast<int>(long long)是否安全(保证行为)?

或者我应该先static_cast<int>(val & 0xffffffffLL)

1 个答案:

答案 0 :(得分:1)

它是安全的,但它可能是实现定义的。

首先,

  

4.8积分转换[conv.integral]

     

1 整数类型的prvalue可以转换为prvalue   另一个整数类型。未展开的枚举类型的prvalue可以   被转换为整数类型的prvalue。

     

3 如果目标类型已签名,则值可以保持不变   以目的地类型表示; 否则,值为   实现定义

现在,

  

3.9.1基本类型 [basic.fundamental]

     

2 有五种标准的有符号整数类型:signed charshort intintlong intlong long int。在此列表中,   每种类型至少提供与之前相同的存储空间   列表。可能还有实现定义的扩展签名   整数类型。标准和扩展有符号整数类型是   统称为有符号整数类型。平原有自然的特征   执行体系结构建议的大小   环境 46 ;提供了其他有符号整数类型   满足特殊需求。

     

46) int也必须足够大才能包含任何值   范围[INT_MIN, INT_MAX],如标题中所定义   <climits>

这意味着,long long至少与int一样大。如果它们具有相同的大小,则它们之间的转换不起作用。如果long long更大,那么它是实现定义的,但我从未见过一个实现,除了根据大小获取前n字节之外,它还会做其他事情。