2007年8月21日 星期二

一個強制型別轉換與運算子優先性的有趣問題?

請問下列result與result1的值分別是多少?
Ex:
char data = 0xC1;
int result = 0, result1 = 0;

result = (int)(data);
result1 = (int)(data & 0xFF);
.
.
.
.
.
.
答案是result = -63, result = 193
您知道為什麼嗎?

1 則留言:

Black 提到...

我不是很確定, 也懶得去查, 我猜一下好了:
第一個強制型別轉換是是由 signed 8 bit 轉為 signed 32 bit, 第一個 bit 的第一個 bit 是 1, 表示它原本是負值. 它是執行 signed extension, 於是轉成 32 bit 就變成也是負值了.
第二個先執行一個 0xff &, 一個 16 進位的常數被當成 unsigned, 於是 ( data & 0xff) 被當成 unsigned char, 於是前面是填 0 進去.
當然, 這還有很多細節要討論: 如 ( (signed & unsigned) 和 (unsigned & signed) 是不是一樣? 為什麼它一定要變成 unsigned? 這就有頼對於 C 和對 Compiler 較熟的人來回答了
期待你的標準答案!!