首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >双到无符号int / char

双到无符号int / char
EN

Stack Overflow用户
提问于 2014-02-09 14:26:32
回答 1查看 1.6K关注 0票数 7

我读过here,那是:

根据C99第6.3.1.4节脚注50:

当整数类型的值转换为无符号类型时执行的剩余操作不需要在实际浮点数类型的值转换为无符号类型时执行。因此,便携式实际浮动值的范围是(Utype_MAX+1 1,−1)。

现在,我对细微的差别感兴趣(这次是C++ 03!)之间:

代码语言:javascript
复制
double d1 = 257;
double d2 = -2;

unsigned char c1 = d1; // undefined, since d1 > 256
unsigned char c2 = d2; // undefined, since d2 < -1

代码语言:javascript
复制
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),这是否有必要这样做?

代码语言:javascript
复制
double d2 = -2;
int sign = (d2<0 ? -1 : 1);

unsigned char c2 = sign * (int)abs(d2); // defined, c2 == 2^8-2 ?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-09 14:44:05

是的,同样的规则也适用于C++。(然而,我将遵循2010年的C++标准草案;C++ 2003已经过时了。而且,我使用的是N3092,而不是正式的草案。)第4.9条第1款说:“如果截断的值不能用目标类型表示,则行为是未定义的。”

无符号整数算法确实是换行的;它执行的模1比类型的最大值多。但是,这适用于类型内的算术。从浮点到无符号整数的转换不是其中的一部分.

转换int的代码似乎比必要的要复杂。如果intint的范围内,您可以简单地使用unsigned char c2 = (int) d2;。(虽然从intunsigned int的转换也是齐次无符号整数算法之外的,但这种转换的规范确实表示它的简化方式与无符号整数算法是一样的。)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21660250

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档