在c ++中,从unsigned int到int的转换总是保留位模式吗?

ste*_*ano 12 c++ casting language-lawyer

从标准(4.7)看起来,当它们使用相同数量的位时,从int转换为unsigned int,纯粹是概念性的:

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

因此,在此方向上,转换会保留位掩码.我不确定标准是否保证从unsigned int到int的转换相同(同样,假设使用相同的位数).这里的标准说:

如果目标类型是有符号的,如果它可以在目标类型(和位域宽度)中表示,则该值不变; 否则,该值是实现定义的.

这究竟是什么意思"目的地类型"?例如,2 ^ 32-1不能用32位int表示.这是否意味着它无法在目标类型中表示,因此不能假设位模式保持不变?

ipc*_*ipc 5

你不能假设任何事情

\n\n

第一个引用并未说明位掩码保持不变。它可能在二进制补码中相同,但在二进制补码或其他表示中不同。

\n\n

其次,implementation-de\xef\xac\x81ned 意味着implementation-de\xef\xac\x81ned,你不能假设任何一般情况。

\n\n

理论上,每次转换后的表示形式可能完全不同。就是这样。

\n\n
\n\n

如果你以现实的方式看待它,事情就会变得更加具体。通常,int 以二进制补码形式存储,并且signed->unsigned 与unsigned->signed 一样保留模式(因为该值可以是实现de\xef\xac\x81ned,所以最便宜的方法是不执行任何操作)。

\n

  • (假设采用二进制补码表示法)第一个引用确实表明位掩码保持不变。事实上,它确实是这么说的。注意:在二进制补码表示中,这种转换是概念性的,位模式没有变化(如果没有截断)。换句话说,如果转换为相同大小的无符号整数类型,则位图案将完全相同。 (2认同)