双倍到无符号的整数/字符

double to unsigned int / char

本文关键字:整数 字符 无符号      更新时间:2023-10-16

我在这里读到:

根据C99 §6.3.1.4脚注50:

当整数类型的值为 当值为 real 时,不需要执行转换为无符号类型 浮动类型将转换为无符号类型。因此,范围 可移植的实际浮点值为 (−1, Utype_MAX+1)。

现在,我对以下两者之间的细微区别感兴趣(这次是 C++ 03 年!

double d1 = 257;
double d2 = -2;
unsigned char c1 = d1; // undefined, since d1 > 256
unsigned char c2 = d2; // undefined, since d2 < -1

double d1 = 257;
double d2 = -2;
unsigned int i1 = d1; // defined, since d1 <= 2^32
unsigned int i2 = d2; // still undefined, right?
unsigned char c1 = i1; // defined, modulo 2^8, so c1 == 1

所以第一c1和第二c1不能保证平等比较,对吧?上面的引用是否也适用于C++03,或者还有其他规则吗?

编辑:

为了使c2定义(对于-(2^31-1) <= d2 < 0)有必要这样做吗?

double d2 = -2;
int sign = (d2<0 ? -1 : 1);
unsigned char c2 = sign * (int)abs(d2); // defined, c2 == 2^8-2 ?

是的,同样的规则适用于C++。(但是,我使用的是 2010 年 C++ 标准草案;C++2003年已经过去了。另外,我使用的是N3092,而不是官方草案。第 4.9 条第 1 款说:"如果截断的值无法在目标类型中表示,则行为未定义。

无符号整数算术确实换行;它执行的模 1 比类型的最大值多。但是,这适用于类型中的算术。从浮点到无符号整数的转换不是其中的一部分。

用于转换d2的代码似乎比必要的复杂。如果d2int范围内,你可以简单地使用unsigned char c2 = (int) d2;。(尽管从 intunsigned int 的转换也在齐次无符号整数算术之外,但此转换的规范确实说它以减少与无符号整数算术相同的方式。