static_cast<int>(long long)
是否安全(保证行为)?
或者我应该先static_cast<int>(val & 0xffffffffLL)
?
答案 0 :(得分:1)
它是安全的,但它可能是实现定义的。
首先,
4.8积分转换[conv.integral]
1 整数类型的prvalue可以转换为prvalue 另一个整数类型。未展开的枚举类型的prvalue可以 被转换为整数类型的prvalue。
3 如果目标类型已签名,则值可以保持不变 以目的地类型表示; 否则,值为 实现定义强>
现在,
3.9.1基本类型 [basic.fundamental]
2 有五种标准的有符号整数类型:
signed char
,short int
,int
,long int
和long long int
。在此列表中, 每种类型至少提供与之前相同的存储空间 列表。可能还有实现定义的扩展签名 整数类型。标准和扩展有符号整数类型是 统称为有符号整数类型。平原有自然的特征 执行体系结构建议的大小 环境 46 ;提供了其他有符号整数类型 满足特殊需求。46)
int
也必须足够大才能包含任何值 范围[INT_MIN, INT_MAX]
,如标题中所定义<climits>
。子>
这意味着,long long
至少与int
一样大。如果它们具有相同的大小,则它们之间的转换不起作用。如果long long
更大,那么它是实现定义的,但我从未见过一个实现,除了根据大小获取前n
字节之外,它还会做其他事情。