【发布时间】:2013-01-17 20:42:57
【问题描述】:
从标准 (4.7) 看来,从 int 到 unsigned int 的转换,当它们都使用相同的位数时,纯粹是概念性的:
如果目标类型是无符号的,则结果值是最小的 与源整数一致的无符号整数(模 2 n 其中 n 是用于表示无符号类型的位数)。 [注:在 二进制补码表示,这种转换是概念性的,并且 位模式没有变化(如果没有截断)。 — 尾注]
所以在这个方向上,转换会保留位掩码。我不确定标准是否保证从 unsigned int 到 int 的转换相同(再次假设使用相同的位数)。这里的标准说:
如果目标类型是有符号的,如果可以,则值不变 以目标类型(和位域宽度)表示;否则, 该值是实现定义的。
这里的“目标类型”到底是什么意思?例如 2^32-1 不能用 32 位整数表示。这是否意味着它不能在目标类型中表示,因此不能假设位模式将保持不变?
【问题讨论】:
-
理论上您可以是一个互补系统,并且位模式可能会改变。这将是 C++ 标准之外的东西。但实际上,是否有任何非二进制补码系统了?
标签: c++ casting language-lawyer