I read here https://stackoverflow.com/questions/10541200/casting-double-to-unsigned-int, that:
根据 C99 §6.3.1.4 脚注 50:
当整数类型的值是时执行的余数运算
当值为实数时无需转换为无符号类型
浮点类型转换为无符号类型。因此,范围为
可移植的实浮点值为(−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
and
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 也有效吗?或者还有其他规则吗?
Edit:
以及为了制作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 ?