繁体   English   中英

double to unsigned int / char

[英]double to unsigned int / char

在这里读到:

根据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

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转换也在同构无符号整数运算之外,但是这个转换的规范确实说它的减少方式与无符号整数运算相同。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM