我无法找到标准中int
值如何转换为unsigned long long
的确切规范。各种类似的转换,例如int - > unsigned,unsigned - > int(UB if negative),unsigned long long - >指定了int等
例如GCC,-1
转换为0xffffffffffffffff
,而不是0x00000000ffffffff
。我能依靠这种行为吗?
答案 0 :(得分:2)
是的,这是明确定义的,它基本上是max unsigned long long + 1
添加到-1
,它始终是max unsigned long long
。 draft 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 ++默认情况下会这样做。但是,值得记住的是,没有正式的支持,因此便携式代码会产生轻微的(现在的计算机不必要)效率低下。