gpt4 book ai didi

c - C 如何将无符号转换为有符号的工作?

转载 作者:行者123 更新时间:2023-12-04 12:04:12 26 4
gpt4 key购买 nike

标准中的哪种语言使此代码工作,打印“-1”?

unsigned int u = UINT_MAX;
signed int s = u;
printf("%d", s);
https://en.cppreference.com/w/c/language/conversion

otherwise, if the target type is signed, the behavior is implementation-defined (which may include raising a signal)


https://gcc.gnu.org/onlinedocs/gcc/Integers-implementation.html#Integers-implementation
  • GCC supports only two’s complement integer types, and all bit patterns are ordinary values.

  • The result of, or the signal raised by, converting an integer to a signed integer type when the value cannot be represented in an object of that type (C90 6.2.1.2, C99 and C11 6.3.1.3):

    For conversion to a type of width N, the value is reduced modulo 2^N to be within range of the type; no signal is raised.


对我来说,这似乎是在转换 UINT_MAXint因此将意味着除法 UINT_MAX来自 2^(CHAR_BIT * sizeof(int)) .为了便于论证,使用 32 位整数, 0xFFFFFFFF / 2^32 = 0xFFFFFFFF .所以这并不能真正解释值“-1”如何在 int 中结束。 .
其他地方是否有某种语言说在模除之后我们只是重新解释这些位?或者标准的其他部分优先于我引用的部分?

最佳答案

C 标准的任何部分都不能保证您的代码通常会打印 -1。正如它所说,转换的结果是实现定义的。但是,GCC 文档确实 promise ,如果您使用它们的实现进行编译,那么您的代码将打印 -1。这与位模式无关,只是数学。
GCC 手册中“reduced modulo 2^N”的明确意图是结果应该是signed int 范围内的唯一数字。即与输入一致模 2^N。这是定义您期望的“包装”行为的精确数学方法,这恰好与您通过重新解释位得到的结果相吻合。
假设 32 位,UINT_MAX具有值 4294967295。这是全等 mod 4294967296 到 -1。即4294967295与-1的差是4294967296的倍数,即4294967296本身。此外,这必然是 [-2147483648, 2147483647] 中唯一的此类数字。 (与 -1 一致的任何其他数字至少为 -1 + 4294967296 = 4294967295 ,或至多为 -1 - 4294967296 = -4294967297 )。所以 -1 是转换的结果。
换句话说,重复加或减 4294967296,直到得到一个在 signed int 范围内的数字。 .保证只有一个这样的数字,在这种情况下它是 -1。

关于c - C 如何将无符号转换为有符号的工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69520022/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com