繁体   English   中英

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

[英]Is conversion int -> unsigned long long defined by the standard

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

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

是的,这是明确定义的,它基本上是将max unsigned long long + 1-1 ,这将始终是max unsigned long long 这在C ++标准草案4.7节“ 积分转换”中有所介绍:

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

它与C99完全相同,但从第6.3.1.3节有符号和无符号整数开始C99标准草案更容易理解:

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

脚注49说:

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

是的,它的定义是:

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

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

无符号整数最小为-1(模2 sizeof(unsigned long long) )是unsigned long longunsigned long long

无符号整数保证模运算。 = K*2 + , where K is either 0 or 1, and where n is the number of value representation bits for unsigned long . 因此,任何intv被转换为unsigned longu ,使得 = K * 2 + ,其中K是0或1,并且其中nunsigned long整数的值表示位数。 . 换句话说,如果v为负数,则只需加2


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


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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM