【发布时间】:2020-04-08 16:44:09
【问题描述】:
再次,关于 C++ 和有符号 -> 无符号(相同大小)转换/转换。
C++ 标准 4.7/2 规定:
如果目标类型是无符号的,则结果值是与源整数一致的最小无符号整数(模 2n,其中 n 是用于表示无符号类型的位数)。 [注意:在二进制补码表示中,这种转换是概念性的,位模式没有变化(如果没有截断)。]
好的,在二进制补码表示中static_cast 和std::bit_cast 产生相同的位模式。
static_cast<unsigned>(signed) 是否有任何理由更改一个补码或有符号幅度表示中的位模式?
由于“模 2^n ...”,static_cast<unsigned>(signed) 可能总是以位模式产生二进制补码表示(与 unsigned x = -1 总是产生 111..1 位模式相同)?
【问题讨论】:
-
bit_cast仅在 C++20 中可用。而且,在 C++20 中,唯一允许的整数表示是二进制补码。我不明白你的问题“static_cast(signed) 有什么理由改变一个补码或有符号幅度表示中的位模式吗?”。您是在问,为什么标准要求模 2^n 行为?因为,在模 2^n 中,非二进制补码的位模式可以改变。我认为强制模 2^n 行为是有意义的,因为它将在平台之间保持一致。 -
@geza 是的,bit_cast 是 c++20 功能,但假设它之前可用。问题是: static_cast
(signed) 在一个补码或有符号幅度的情况下如何改变位模式,为什么? -
嗯,这很简单。假设数字-1。在一个的补码中,它具有
1111 1110的表示。如果将其转换为无符号,根据取模规则,数值应变为 255。但 255 的表示形式为1111 1111。所以表示已经改变了。 -
@geza 谢谢!这是否正确: static_cast
(signed) 为任何有符号数生成二进制补码位模式,除了负零(对于非二进制补码表示)? -
是的,我认为这是真的。
标签: c++