2013年2月5日 星期二

c 語言的 char 是 signed 還是 unsigned

作者: dryman (dryman) 看板: Programming
標題: Re: [請益] C 變數型態 可攜
時間: Mon Feb 4 11:02:52 2013

http://www.ptt.cc/bbs/Programming/M.1359946975.A.AFC.html

這篇提到一個有趣的程式碼:

a.c
 1 #include <stdio.h>
 2 
 3 int main(void)
 4 {
 5   unsigned char a = 0xff;
 6   char b = 0xff;
 7   int c = a==b; // true, or false?
 8   printf("C: %d\n",c);
 9   printf("a: %d\n", a);
10   printf("b: %d\n", b);
11   return 0;
12 }

不過 「char 是 signed 或是 unsigned 是由 c compiler 決定的」, 並不是標準, 在 gcc 上得到 0, 那麼在其他的 c compiler 的結果呢? 找到反證才能證明, 才能確信上面的話是對的。

我總是對這樣的事情半信半疑, 雖然書上應該不會有錯, 但總是希望找到證明。還好, 很容易就找到了。

openwatcom c/c++ 就是一個反例:

C: 1
a: 255
b: 255
這是由 openwatcom c/c++ 編譯後的執行結果, char b 是 unsigned。

gnu c 的版本呢?
C: 0
a: 255
b: -1
char b 是 signed。

使用 char 要記得這件事, 要不然遇到 signed/unsiged 地雷,  可是想破頭都不知道為什麼。
這是在 C 專家編程這本書看到的。

1 則留言:

  1. 我一直以為不管是 signed 或 unsigned, 在 C 裡應該都只是比較變數的值 (都是 0xff), 原來是有差別的, 果然凡事都應該實驗過... 感謝分享!!

    回覆刪除

使用 google 的 reCAPTCHA 驗證碼, 總算可以輕鬆留言了。

我實在受不了 spam 了, 又不想讓大家的眼睛花掉, 只好放棄匿名留言。這是沒辦法中的辦法了。留言的朋友需要有 google 帳號。