双倍到无符号的整数/字符
double to unsigned int / char
我在这里读到:
根据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
的代码似乎比必要的复杂。如果d2
在int
范围内,你可以简单地使用unsigned char c2 = (int) d2;
。(尽管从 int
到 unsigned int
的转换也在齐次无符号整数算术之外,但此转换的规范确实说它以减少与无符号整数算术相同的方式。
相关文章:
- 显示基于用户输入的整数的字符
- 尝试将字符串/字符转换为整数会产生意外结果
- 如何使用C++将字符串中的字符转换为整数变量
- 将超出范围的整数分配给有符号字符类型
- 碱基对映射 - 将 argv[i] 移动到整数或字符作为输入
- 当我输入字符类型的数字时,为什么我无法获得整数?
- 输入验证以筛选出字符、字符串和一系列整数
- 字符和整数中 **(ptr+1) 的值差异
- 如何将整数向量值插入字符向量
- 字符到整数数组
- 为什么对无符号字符进行算术运算会将它们提升为有符号整数
- 不能将字符转换为整数吗?
- 如果我们在其中输入一个整数,则字符会给出整数作为输出,但是当分配给它一个整数时,这不会发生。为什么?
- 为什么我们不能将使用异或运算找到的整数转换为字符?
- 有没有办法将字符类型转换为整数?
- 在c++中读取文件时,它如何自动将字符放入字符数组,将数字放入整数变量
- (C/C++)fscanf_s从txt文件以字符形式读取数组时缺少整数参数错误
- 如何从字符数组C++中提取2个整数并将它们存储在2个变量中(初学者)
- 取消随机排列整数/字符数组
- 双倍到无符号的整数/字符