ste*_*ano 12 c++ casting language-lawyer
从标准(4.7)看起来,当它们使用相同数量的位时,从int转换为unsigned int,纯粹是概念性的:
如果目标类型是无符号的,则结果值是与源整数一致的最小无符号整数(模2 n,其中n是用于表示无符号类型的位数).[注意:在二进制补码表示中,此转换是概念性的,并且位模式没有变化(如果没有截断). - 结束说明]
因此,在此方向上,转换会保留位掩码.我不确定标准是否保证从unsigned int到int的转换相同(同样,假设使用相同的位数).这里的标准说:
如果目标类型是有符号的,如果它可以在目标类型(和位域宽度)中表示,则该值不变; 否则,该值是实现定义的.
这究竟是什么意思"目的地类型"?例如,2 ^ 32-1不能用32位int表示.这是否意味着它无法在目标类型中表示,因此不能假设位模式保持不变?
你不能假设任何事情。
\n\n第一个引用并未说明位掩码保持不变。它可能在二进制补码中相同,但在二进制补码或其他表示中不同。
\n\n其次,implementation-de\xef\xac\x81ned 意味着implementation-de\xef\xac\x81ned,你不能假设任何一般情况。
\n\n理论上,每次转换后的表示形式可能完全不同。就是这样。
\n\n如果你以现实的方式看待它,事情就会变得更加具体。通常,int 以二进制补码形式存储,并且signed->unsigned 与unsigned->signed 一样保留模式(因为该值可以是实现de\xef\xac\x81ned,所以最便宜的方法是不执行任何操作)。
\n| 归档时间: |
|
| 查看次数: |
1696 次 |
| 最近记录: |