首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这个“额外”的铸造需要吗?

这个“额外”的铸造需要吗?
EN

Stack Overflow用户
提问于 2011-03-09 16:09:06
回答 2查看 1.2K关注 0票数 1

情况:

代码语言:javascript
复制
typedef unsigned int u32;
typedef unsigned char u8;

const u8 *x;
...
var = (u32)(*(const u32 *)x);

var应该包含一个DWORD大小的值。关于上面的任务说明,我所知道的是:

  1. x首先是指向u8大小值的指针。然后将
  2. x转换为指向u32大小的值,因此我们有:(const u32 *)x.
  3. x然后取消引用,以获得它所指向的32位值,因此我们有:*(const u32 *)x
  4. ,然后将非引用的数据转换为u32大小。

最后,问题是:我认为在上面的第3条中,去引用会说我们从它得到的值是32位大小,所以如果是这样的话,为什么会有额外的强制转换(显式的?)说去引用的值是32位吗?仅仅执行上面的步骤1到3,而不必执行第4步,这不是很好吗?

谢谢你的澄清!

EN

回答 2

Stack Overflow用户

发布于 2011-03-09 16:25:22

最后的演员阵容是好的,因为你正在使用它的RHS的一个任务。

不确定是*运算符。这可能会给您两个未定义的行为:

访问bounds

  • char以外的对象的
  • 通常与其他整数类型的对齐方式不同。
票数 1
EN

Stack Overflow用户

发布于 2011-03-09 16:26:39

在这种情况下,不需要最终的强制转换。以下表达方式:

代码语言:javascript
复制
(*(const u32 *)x)

返回"const u32“值。因为您将它赋值给一个变量(可能是一个u32变量),所以您可以创建一个"const u32“值的副本,并且这个副本不需要是const。你自己决定你是否想要你刚刚制作的副本应该是康斯特的。因此,这是有效的:

代码语言:javascript
复制
u32 var = *(const u32 *)x;

但这也是有效的:

代码语言:javascript
复制
const u32 var = *(const u32 *)x;

但是在这种情况下,您不能在赋值之后再更改var的值。

请注意,此语句无效:

代码语言:javascript
复制
u32 &var = *(const u32 *)x;

在这种情况下,您不是在复制,而是将var作为x变量内容的别名,如果表达式的结果是const,则别名也应该是const。

编译器可能会给出如下错误消息:

代码语言:javascript
复制
cannot convert from 'const u32' to 'u32 &'

相反,您必须这样写:

代码语言:javascript
复制
const u32 &var = *(const u32 *)x;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5248569

复制
相关文章

相似问题

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