我在这里阅读到(此处):
根据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++11: 4.9/1]
中完全相同(也在 n3690 中找到,那是去年五月的 C++1y 草案)。 - Lightness Races in Orbitint
转换为unsigned int
时,没有任何位重新排列的过程,对吧?而当unsigned int
转换为unsigned char
时,始终会丢弃高位比特,对吧?那么,如果d
在char
的范围内(例如 -2),则unsigned char ca = (char)d
和unsigned char cb = (int)d
总是相等的,对吧? - mb84