çFAQ問題16.7:http://c-faq.com/strangeprob/ptralign.html爲什麼C FAQ問題16.7中的不一致行?
我有一個關於該行的一個問題:
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的評論作爲答案,雖然演員的優先順序和< <並不是真的讓我困惑。
P.S.我無法將問題提交給FAQ的作者,因爲他不再通過電子郵件接受任何問題。
那麼,爲什麼同樣的理由不適用於前面兩行? – Nemo 2011-05-29 05:24:38
在執行移位操作之前將* p ++轉換爲unsigned(int)會出現什麼問題? – 2011-05-29 05:25:50
我想這個問題是:爲什麼沒有對兩行使用'<< 16'和'<< 24' – ChrisWue 2011-05-29 05:27:47