【问题标题】:Why is signed char not getting upcasted to unsigned int here?为什么signed char 在这里没有被向上转换为unsigned int?
【发布时间】:2020-03-04 20:38:06
【问题描述】:
#include <stdio.h>

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

在上面的程序中,我希望将有符号字符向上转换为无符号整数,因此总和为 x + y = 1 + 2^32 -1 = 2^32。但令人惊讶的是它会打印 0。

以前,我曾尝试打印 (x>y) 并得到 false (0) 作为输出。我无法弄清楚这里发生了什么,有人可以解释在这种情况下如何进行铸造吗?

【问题讨论】:

  • y 可能被提升为int
  • 此链接与您的问题有关:github.com/LambdaSchool/CS-Wiki/wiki/…
  • y 被转换为int。但是,请注意2^321 &lt;&lt; 32,这意味着零,因为unsigned int 只有 32 位,并且 [shifted] 值为 0x100000000,不能包含在 32 位中并被截断为零。
  • 我收到有关此代码的警告:error: conversion to 'unsigned int' from 'signed char' may change the sign of the result [-Werror=sign-conversion]。我认为这是它所警告的那种事情。
  • 引用:“= 2^32。但令人惊讶的是它打印出 0。”嗯...您如何期望将 2^32 存储在 32 位无符号中?

标签: c output


【解决方案1】:

将 232 计算为 unsigned int 结果为 0 也就不足为奇了。在具有 32 位 ints 的机器上,UINT_MAX 为 232 sup>-1 和 232 超出范围。与任何其他无符号算术一样,超出范围的值是减模 UINT_MAX + 1(即 232),结果为 0。

具体来说,在评价x + y

首先,根据“整数促销”,y 被转换为(签名的)int。这不会改变y 的值;它仍然是-1。

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

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

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

此外,分配给的变量的类型不会改变计算。只有在计算结果时,才会考虑将如何处理结果。例如,如果 sum 已声明为 unsigned long long int,则计算将完全相同,sum 仍为 0。为了使额外的精度有用,您必须首先将 y 转换为 @987654341 @ 手动,然后通过手动将参数之一转换为 + 来确保以额外的精度计算加法:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-15
    • 2012-04-28
    • 2012-09-27
    • 1970-01-01
    • 2014-12-27
    • 1970-01-01
    • 2012-05-24
    • 2012-11-27
    相关资源
    最近更新 更多