Tim*_*Tim -2 c integer type-conversion
在C11标准中
\n\n\n6.3.1.3 有符号和无符号整数
\n1 当一个整数类型的值转换为_Bool以外的其他整数类型时,如果该值可以用新类型表示,则该值保持不变。
\n2 否则,如果新类型是无符号的,则通过在新类型中可以表示的最大值上重复加或减 1 来转换该值,直到该值在新类型的范围内。60)
\n3 否则,新类型将被签名,且值无法在其中表示;结果要么是实现de\xef\xac\x81ned,要么引发实现de\xef\xac\x81ned 信号。
\n
在第一点中,
\n我想知道第一点中的“如果该值可以用新类型表示”是什么意思?两种整数类型可能具有不同的整数范围,但可以具有相同的位表示范围。(例如,unsigned int 和 int。)
\n转换前后位表示形式和整数值是否都没有改变?
\n谢谢。
\nC 标准没有规定整数的一种特定表示形式。虽然您可能遇到的大多数实现都使用二进制补码来表示有符号整数,但这并不能保证。它还允许使用补码,其中对数字求反意味着反转所有位(而不是像二进制补码那样加 1),或者使用符号和数值,其中对数字求反意味着仅反转高位。
因此,标准的语言讨论的是整数的值在转换时会发生什么,而不是表示形式。
例如,假设 anint的范围为 -2 31到 2 31 -1,并且unsigned int范围为 0 到 2 32 -1。如果您有一个int值 45 的值被转换为unsigned int,则该值可以用两种类型表示,因此现在您有一个unsigned int值 45 的值。
现在假设你的int值为-1000。该值不能用 an 表示unsigned int,因此必须按照第 2 条中的规则进行转换,即将 2 32添加到 -1000 得到 2 32 - 1000 == 4294966296。现在在二进制补码表示中,一个unsigned intwith 值4294966296 和int值为 -1000 的值恰好具有相同的表示形式,即十六进制的 FFFFFC18。这种等价不适用于补码或符号和数值。
因此,将数字转换为不同的类型可能会也可能不会改变表示形式,具体取决于实现。