是转换int - >由标准定义的unsigned long long

时间:2014-03-02 18:16:36

标签: c++ type-conversion standards

我无法找到标准中int值如何转换为unsigned long long的确切规范。各种类似的转换,例如int - > unsigned,unsigned - > int(UB if negative),unsigned long long - >指定了int等

例如GCC,-1转换为0xffffffffffffffff,而不是0x00000000ffffffff。我能依靠这种行为吗?

3 个答案:

答案 0 :(得分:2)

是的,这是明确定义的,它基本上是max unsigned long long + 1添加到-1,它始终是max unsigned long longdraft C++ standard部分4.7 积分转换中介绍了以下内容:

  

如果目标类型是无符号的,则结果值是与源整数一致的最小无符号整数(模2 n ,其中n是用于表示无符号类型的位数)。 [注意:在二进制补码表示中,此转换是概念性的,并且位模式没有变化(如果没有截断)。 - 后注]

它与C99完全相同,但draft C99 standard更容易理解,来自6.3.1.3 有符号和无符号整数

  

否则,如果新类型是无符号的,则通过重复添加或转换该值   减去一个可以在新类型中表示的最大值   直到该值在新类型的范围内。 49)

脚注49说:

  

规则描述了数学值的算术,而不是给定类型表达式的值。

答案 1 :(得分:1)

是的,已定义:

C ++11§4.7[conv.integral] / 2说:

  

如果目标类型是无符号的,则结果值是与源整数一致的最小无符号整数(模2 n ,其中n是用于表示无符号类型的位数)。 / p>

最小无符号整数与-1一致(模2 sizeof(unsigned long long) )是unsigned long long可能的最大值。

答案 2 :(得分:1)

无符号整数保证模运算。因此,任何int v 都会转换为unsigned long u ,以便 u = K * 2 n + v ,其中K为0或1,其中 n 是{的值表示位数{1}}。换句话说,如果 v 为负数,只需添加2 n


2的幂来自C ++标准的要求,即整数用纯二进制系统表示。对于 n 值表示位,可能值的数量为2 n 。浮点类型没有这样的要求(您可以使用unsigned long来检查浮点值表示的基数)。


另请注意,为了迎合一些现在过时的平台,以及一个以自己的方式做事的流行编译器,当无符号值不能直接表示为有符号值时,标准将相反的转换保留为未定义的行为。实际上,在现代系统中,可以告诉所有编译器使反向转换与转换为无符号类型完全相反,例如, Visual C ++默认情况下会这样做。但是,值得记住的是,没有正式的支持,因此便携式代码会产生轻微的(现在的计算机不必要)效率低下。