gpt4 book ai didi

c++ - 将 unsigned [char, short, int, long] 转换为 double 的结果不一致

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:59:41 38 4
gpt4 key购买 nike

#include <stdio.h>

int main(int argc, char* argv[]) {
unsigned char c = 10;
unsigned short d = 10;
unsigned int e = 10;
unsigned long f = 10;
double g = -c;
double h = -d;
double i = -e;
double j = -f;
printf("%d %lf\n", c, g);
printf("%u %lf\n", d, h);
printf("%u %lf\n", e, i);
printf("%lu %lf\n", f, j);
}

给出输出

10 -10.000000
10 -10.000000
10 4294967286.000000
10 18446744073709551616.000000

为什么结果不一致,对某些类型产生 -10 而对其他类型产生巨大的值?

最佳答案

一元 - 运算符的操作数被提升;比 int 窄的类型被提升为 intunsigned int

由于 (signed) int 可以保存所有可以由 unsigned char 表示的值,因此值 (unsigned char)10被提升为 signed int10。取反会得到(带符号的)int-10,然后将其转换为 double

unsigned int 不会“提升”为 int,因为 int 不能保存所有值。所以表达式 -e 应用了 unsigned int 取反运算符,这显然不能产生负值。结果是 UINT_MAX + 1 - 10,在您的系统上是 4294967286。转换为 double 会产生您看到的值。

同样,unsigned long 未被提升,因此 -f 产生 ULONG_MAX + 1 - 10,当转换为 double 产生 18446744073709551606 (264-10)(显然你的系统有 64 位 longunsigned long)。将该值转换为 double 会损失一些精度,从而生成您看到的值。

除了提升规则之外,重要的是要记住 C 表达式的类型(几乎总是)不受它出现的上下文的影响。 -f 产生相同值和类型的结果,无论它分配给什么。

关于c++ - 将 unsigned [char, short, int, long] 转换为 double 的结果不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20080314/

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