gpt4 book ai didi

c - 为什么这里没有将 signed char 升级为 unsigned int?

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

#include <stdio.h>

int main()
{
unsigned int x =1;
signed char y = -1;
unsigned int sum = x + y;
printf("%u", sum);
}

在上面的程序中,我希望将 signed char 转换为 unsigned int,因此总和为 x + y = 1 + 2^32 -1 = 2^32。但令人惊讶的是它打印出 0。

之前,我曾尝试打印 (x>y) 并得到 false (0) 作为输出。我不知道这里发生了什么,有人可以解释一下在这种情况下如何进行类型转换吗?

最佳答案

将 232 作为 unsigned int 结果计算为 0 并不奇怪。在具有 32 位 int 的机器上s, UINT_MAX 为 232−1 且 232 超出范围。与任何其他无符号算术一样,超出范围的值是模数 UINT_MAX + 1 的约化(即 232),结果为 0。

具体来说,在 x + y 的计算中:

首先,根据“整数提升”,y 被转换为(有符号的)int。这不会改变 y 的值;它仍然是-1。

然后,按照“通常的算术转换”,由于 unsigned intint 具有相同的等级,y 被转换为 unsigned int,使其值为 232 − 1。

最后,使用 unsigned int 算法计算加法。如上所述,结果为 0。

x > y 的计算遵循完全相同的顺序。由于在计算比较之前 y 已转换为 unsigned int,因此结果为(可能出乎意料)false。这就是为什么一些编译器会警告有符号值和无符号值之间的比较。

此外,分配给变量的类型不会改变计算。只有在计算结果时,才会考虑对结果做什么。例如,如果 sum 已被声明为 unsigned long long int,则计算将以相同方式完成并且 sum 仍为 0。对于额外的精度有用,您必须首先将 y 手动转换为 unsigned int,然后通过手动转换其中一个参数确保以额外的精度计算加法到+:

unsigned int y_as_int = y;
unsigned long long sum = x + (unsigned long long)y_as_int;

关于c - 为什么这里没有将 signed char 升级为 unsigned int?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60534322/

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