再次谈到C++中关于有符号数和无符号数(尺寸相同)之间的转换和强制类型转换。
根据C++标准4.7/2规定:
如果目标类型是无符号的,结果值是源整数对无符号类型表示所用位数2n取模后的最小无符号整数。(注:在二进制补码表示法下,这种转换是概念性的,如果没有截断,则没有位模式变化。)
在二进制补码表示法下,static_cast和std::bit_cast产生相同的位模式。
在一的补码或符号大小表示法下,static_cast(unsigned)(signed)改变位模式是否有理由?
可能是因为“对2^n取模…”(例如unsigned x = -1总是产生111..1位模式),因此static_cast(unsigned)(signed)始终产生二进制补码表示法的位模式吧?
根据C++标准4.7/2规定:
如果目标类型是无符号的,结果值是源整数对无符号类型表示所用位数2n取模后的最小无符号整数。(注:在二进制补码表示法下,这种转换是概念性的,如果没有截断,则没有位模式变化。)
在二进制补码表示法下,static_cast和std::bit_cast产生相同的位模式。
在一的补码或符号大小表示法下,static_cast(unsigned)(signed)改变位模式是否有理由?
可能是因为“对2^n取模…”(例如unsigned x = -1总是产生111..1位模式),因此static_cast(unsigned)(signed)始终产生二进制补码表示法的位模式吧?
bit_cast
仅在 C++20 中可用。而且,在 C++20 中,唯一允许的整数表示是二进制补码。我不明白你的问题“在一的补码或符号大小表示中,为什么 static_cast<unsigned>(signed) 会改变位模式?”。你是在问,为什么标准规定模 2^n 行为?因为在模 2^n 中,非二进制补码数字的位模式可能会发生变化。我认为强制实行模 2^n 行为是有意义的,因为它将在各个平台上保持一致。 - geza1111 1110
。如果你将它转换为无符号数,根据模数规则,数值应该变成255。但是255的表示形式是1111 1111
。因此,表示形式已经改变了。 - geza