gpt4 book ai didi

c - 为什么 C FAQ 问题 16.7 中的行不一致?

转载 作者:太空狗 更新时间:2023-10-29 16:09:19 25 4
gpt4 key购买 nike

C 常见问题解答问题 16.7:http://c-faq.com/strangeprob/ptralign.html

我有一个关于线路的问题:

s.i32 |= (unsigned)(*p++ << 8);

我理解那行代码是如何工作的,但我不明白为什么它不简单地写成:

s.i32 |= (long) *p++ << 8;

或:

s.i32 |= (unsigned)*p++ << 8; 

为什么会这样?

===========================

struct mystruct {
char c;
long int i32;
int i16;
} s;

char buf[7];
unsigned char *p;
fread(buf, 7, 1, fp);
p = buf;

s.c = *p++;

s.i32 = (long)*p++ << 24;
s.i32 |= (long)*p++ << 16;
s.i32 |= (unsigned)(*p++ << 8); // line in question
s.i32 |= *p++;

s.i16 = *p++ << 8;
s.i16 |= *p++;

============

更新:

我仍然不清楚为什么必须在相关行的移位操作之后进行转换。也许正如littleadv所说,“这是一个例子,不是唯一的可能性”。

如果我提出的两个备选方案有任何问题,请添加您的答案。现在我选择 littleadv 的评论作为答案,尽管 cast 和 << 的优先顺序并不是真正让我感到困惑的地方。

附言我无法将问题直接发送给常见问题解答的作者,因为他不再通过电子邮件接受任何问题。

最佳答案

因为类型转换在<<之上在order of precedence ,并且您希望转换为 << 的结果.

编辑澄清

long 转换之前完成转换的原因,并在移动 unsigned 之后在 different question with the same code 中解释:

“此代码假定 getc 读取 8 位字符,并且数据首先存储最高有效字节(``big endian'')。转换为 (long) 确保 16 位和 24 位移位对 long 值进行操作(参见问题 3.14),并且转换为 (unsigned) 防止符号扩展。(通常,在编写这样的代码时使用所有无符号类型更安全,但参见问题 3.19。)”。

关于c - 为什么 C FAQ 问题 16.7 中的行不一致?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6166080/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com