static_cast<unsigned>(signed) 和 std::bit_cast<unsigned>(signed) 之间有区别吗?

ily*_*nxy 6 c++

再次,关于 C++ 和有符号 -> 无符号(相同大小)转换/转换。

C++ 标准 4.7/2 规定:

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

好的,以二进制补码表示static_caststd::bit_cast产生相同的位模式。

是否有任何理由static_cast<unsigned>(signed)在一个补码或有符号幅度表示中更改位模式?

static_cast<unsigned>(signed)总是产生在位模式二进制补码表示,由于“模数2 ^ N ...”(与unsigned x = -1总产111..1位模式)?

dar*_*une 0

对于补码,您会遇到偏移量为 -1 的问题:

\n\n
\n

在常数(\xe2\x88\x921)内,补码的行为类似于原始数字的二进制加法的负数。然而,与二进制补码不同的是,这些数字并没有得到广泛使用,因为诸如 \xe2\x88\x921 的偏移量之类的问题,对零求反会导致\n 明显的负零位模式,更少算术借用等的简单性

\n
\n\n

例如,使用 , 转换1 的补码(与 8 位无符号 255 具有相同的位模式)中的static_cast“-0”,当转换为遵循中 qout 的文本转换为无符号时,应得到“0”。问题。这需要改变位。

\n