您的位置:首页 > 其它

不能碰这个

2014-05-07 13:31 85 查看
的目的是做static_cast类型之间的转换没有正常运行时检查。C++提供了铸件,其他几种类型包括dynamic_cast,reinterpret_cast,和const_cast,都具有不同的行为。

用C语言风格的铸造的问题是,它可以用一个static_cast,reinterpret_cast,或const_cast(或其组合)根据不同的情况,我们不知道哪一个(S)要接。这就是为什么使用static_cast是安全的——我们总是知道该做什么,如果我们尝试做一些事情,这并不意味着,它会给我们一个警告。

这是一个C风格铸造的一个例子:

const char* strmsg =“不能碰这个!”;

无符号字符指针ptr =(无符号字符*)strmsg;

这不仅是一个无符号字符铸造一个字符,它也丢掉了常量。我认为做一个reinterpret_cast和const_cast组合。在任何情况下,你可以看到,这是危险的。让我们试着用C++风格static_cast相反:

const char* strmsg =“不能碰这个!”;

无符号字符指针ptr = static_cast(strmsg);

当我们尝试编译,编译器会抱怨:

C:\测试。CPP(46):错误c2440:“static_cast”:不能从“const
char *”到“无符号字符*”

类型指向是无关的;reinterpret_cast风格转换要求,铸造或功能

你得到5。

所以有什么区别?答案与类型的推广方式。当编译器遇到5 - 10U,它促进了5个无符号值,和5 - 10U结果4294967291(无符号)。然而,值得注意的是,4294967291u和5有相同的位模式——解读完全取决于是否值看作是符号或无符号。

因为5 - 10U产生一个无符号值,法院把它当做一个无符号值,并打印4294967291由于。

然而,在你的情况,你将无符号值返回一个带符号的整数。因为X签署,当你打印X的下一条语句,cout版画的价值就像是签署了,这就是为什么它打印-
5。

所以最终的答案是,声明写的是真的。你只是把4294967291个无符号到符号整数和印刷的价值,这是价值你是直观的期望吧。:)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐