[問題] signed char 使用時機

看板C_and_CPP作者 (蘇打)時間12年前 (2013/08/29 19:21), 編輯推噓5(5027)
留言32則, 11人參與, 最新討論串1/2 (看更多)
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) GCC 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) N/A 問題(Question): 想請教關於 signed char 以及 unsigned char 使用時機 google 了一下,似乎有寫到 signed / unsigned char 差在數值範圍 (signed char = -128~127, unsigned char = 0~255) 不太瞭解何時會需要使用到負數的 char 能否請版友舉個例子呢? 負數的 char 是否有特別的意義? 另外有聽說 char 等同於 unsigned char,這樣說法對嗎? 感謝 餵入的資料(Input): N/A 預期的正確結果(Expected Output): N/A 錯誤結果(Wrong Output): N/A 程式碼(Code):(請善用置底文網頁, 記得排版) N/A 補充說明(Supplement): N/A -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 1.171.20.220 ※ 編輯: DRLai 來自: 1.171.20.220 (08/29 19:31)

08/29 19:45, , 1F
char是signed 還是unsigned視編譯器而定,標準沒規定
08/29 19:45, 1F

08/29 19:46, , 2F
gcc和msvc預設都是signed的樣子
08/29 19:46, 2F

08/29 19:49, , 3F
負數char就用在需要範圍是 -128~127的時候
08/29 19:49, 3F

08/29 19:50, , 4F
char的用途不是只有字元而已
08/29 19:50, 4F

08/29 19:57, , 5F
可以把他想成是節省記憶體的方式嗎?short=2bytes char=1byte
08/29 19:57, 5F

08/29 20:03, , 6F
signed char 和 unsigned char 轉型成 int 時就不同了
08/29 20:03, 6F

08/29 20:04, , 7F
你可以把它理解成 int8_t 和 uint8_t
08/29 20:04, 7F

08/29 20:38, , 8F
其實就在大小之分 如果你的數值在-128~127也可以用s char
08/29 20:38, 8F

08/29 20:52, , 9F
用型態描述值域。有的人數值只有真/偽也在用int,只
08/29 20:52, 9F

08/29 20:52, , 10F
有0~10也在用int,那種 code 看到要吐血
08/29 20:52, 10F

08/29 22:48, , 11F
瞭解了~ 感謝m(_ _)m
08/29 22:48, 11F

08/30 00:01, , 12F
用int也沒有什麼錯啊,以前有人的經驗談說他的同事會寫
08/30 00:01, 12F

08/30 00:02, , 13F
這種code: char i; for (i=0; i<1500; i++) { ... }
08/30 00:02, 13F

08/30 00:03, , 14F
不管是太爛或疏忽(這個例子是太爛),用int至少避免這
08/30 00:03, 14F

08/30 00:03, , 15F
種蠢bug發生
08/30 00:03, 15F

08/30 00:03, , 16F
unsigned int i; for (i=1500; i>0; i--) {...} 比較機車
08/30 00:03, 16F

08/30 00:05, , 17F
反過來講也有人把一堆值加一加當作檔名,結果超過2**31
08/30 00:05, 17F

08/30 00:05, , 18F
系統跑一段時間以後發現新檔案會蓋掉舊的,居然還沒人
08/30 00:05, 18F

08/30 00:05, , 19F
問他為什麼用 unsigned 他說 i 是物件 count , 絕對是正整數
08/30 00:05, 19F

08/30 00:05, , 20F
知道為什麼…
08/30 00:05, 20F

08/30 00:06, , 21F
我寫錯了, 上面的 for 的判斷條件是 i>=0
08/30 00:06, 21F

08/30 00:07, , 22F
caras: 那代表他沒了解 i 真正的意涵不是 count
08/30 00:07, 22F

08/30 00:10, , 23F
我沒辦法講到他懂,只好規定他for裡面只能用signed int...
08/30 00:10, 23F

08/30 00:14, , 24F
typedef 是你的好朋友
08/30 00:14, 24F

08/30 00:16, , 25F
我就想 i > 0 好像很好啊…我還特別打開vmware寫一下 :P
08/30 00:16, 25F

08/30 00:30, , 26F
for 的寫法問題吧 如果 i 真的是物件 count uint還好吧
08/30 00:30, 26F

08/30 01:02, , 27F
也是要腦筋連打三個死結才有辦法寫出這個for loop
08/30 01:02, 27F

08/30 01:03, , 28F
倒著搜索、用uint、index從0開始本身都沒什麼不對
08/30 01:03, 28F

08/30 22:18, , 29F
int 沒有什麼錯啊。用 char 又不一定比較快。int 理論上要
08/30 22:18, 29F

08/30 22:18, , 30F
「最自然」的那個整數型態。char 搞不好更慢。
08/30 22:18, 30F

08/31 00:56, , 31F
char說不定真的還比較慢 如果用CA的觀點來看的話
08/31 00:56, 31F

08/31 02:13, , 32F
最自然是不是說等於目前架構下的暫存器寬度這樣最自然:P
08/31 02:13, 32F
文章代碼(AID): #1I7owmVd (C_and_CPP)
文章代碼(AID): #1I7owmVd (C_and_CPP)