【发布时间】: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^32是1 << 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 位无符号中?