我读过here,那是:
根据C99第6.3.1.4节脚注50:
当整数类型的值转换为无符号类型时执行的剩余操作不需要在实际浮点数类型的值转换为无符号类型时执行。因此,便携式实际浮动值的范围是(Utype_MAX+1 1,−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 ?发布于 2014-02-09 14:44:05
是的,同样的规则也适用于C++。(然而,我将遵循2010年的C++标准草案;C++ 2003已经过时了。而且,我使用的是N3092,而不是正式的草案。)第4.9条第1款说:“如果截断的值不能用目标类型表示,则行为是未定义的。”
无符号整数算法确实是换行的;它执行的模1比类型的最大值多。但是,这适用于类型内的算术。从浮点到无符号整数的转换不是其中的一部分.
转换int的代码似乎比必要的要复杂。如果int在int的范围内,您可以简单地使用unsigned char c2 = (int) d2;。(虽然从int到unsigned int的转换也是齐次无符号整数算法之外的,但这种转换的规范确实表示它的简化方式与无符号整数算法是一样的。)
https://stackoverflow.com/questions/21660250
复制相似问题