Re: [問題] char與int

看板C_and_CPP (C/C++)作者 (高髮箍)時間14年前 (2012/05/13 17:18), 編輯推噓2(206)
留言8則, 2人參與, 最新討論串2/3 (看更多)
※ 引述《lopohsiung (年輕的心)》之銘言: : 大家好!小弟使用的程式語言是VC++2010,近來使用寫程式遇到一個問題,很需要清楚明白的知道 : 為什麼,故來請教各位高手。 : 程式碼很短: 首先請使用 std::numeric_limits<T> 來印出型別資訊 typedef numeric_limits<char> CharLimits; typedef numeric_limits<int> IntLimits; if( CharLimits::is_signed ) cout << (int)CharLimits::max() << endl; else cout << (unsigned)CharLimits::max() << endl; cout << boolalpha << CharLimits::is_signed << endl; cout << IntLimits::max() << endl; cout << boolalpha << IntLimits::is_signed << endl; 以我的例子來說, 輸出如下: 127 <- char 最大值為 127 true <- char 為有號數 2147483647 <- int 最大值為 2147483647 true <- int 為有號數 知道你所使用的平台上, 各型別真正的最大值之後, 再來作以下推 導 (因為都是有號數, 下列方法是常用的和無號數同樣作法, 不是 絕對): 1: char a; 2: int b,c; 3: c=49676; 4: a=c; 5: b=a; : cout<<b<<endl; : cout出來的b是12。 line 4. 因為 char 最大值小於 49676, 所以 a 得到 49676(int) = 49676 % (127+1)(char) = 12 取模是為了能產生該型態能儲存的合法數值 : 假如c=32268,也就是: : char a; : int b,c; : c=32268; : a=c; : b=a; : cout<<b<<endl; : cout出來的b是12。 32268 % (127+1) = 12 : 假如c=29967,也就是: : char a; : int b,c; : c=29967; : a=c; : b=a; : cout<<b<<endl; : cout出來的b是15。 29967 % (127+1) = 15 : 假如c=2320,也就是: : char a; : int b,c; : c=2320; : a=c; : b=a; : cout<<b<<endl; : cout出來的b是16。 2320 % (127+1) = 16 : 到底是為什麼呢?小弟知道char的儲存空間是1byte,儲存值範圍為-128~127,int的話, : 書上寫在32位元系統下儲存空間、範圍與long相同,也就是儲存空間是4bytes,儲存值範 : 圍是-2147483648~2147483647,隱約覺得跟儲存值範圍有關,但確切的原因,電腦到底是 : 怎麼算的?為什麼cout出來的b會是這樣?能否請知道的大大解說一下?非常感謝!!! : 對了!補充一點,小弟的電腦是win7 64位元。 你是用 C/C++ 寫程式, 所以要考慮的應該是語言裡的運算/轉型規 則, 如果沒有明確定義的才去探討 gen 出來的組語及編譯器實作. 最大值最小值是這樣求來的, 不是看書講的 -- ╔═══╗╔═══╗ ╔═╗═╗╔═══╗╔═══╗╔╦═╦╗ 金栽經║ ╔╗ ║║ ╔╗ ║╔╗║ ║ ║║ ═ ║║ ╔╗ ║║║ ║║RAINNOUS ≡≡║ ╚╝ ║║ ╚╝ ║║║║ ║║ ╞╣║ ║║ ║║ ║ ═╣║ ╥ ║║║║ ║ ║║ ═ ║║ ╚╝ ║║ ║ ║ 高佑麗╚═╩═╝╚═╩═╝╚╝╚═╚═╝╚═══╝╚═══╝╚═╩═╝鄭允慧 趙賢榮金智淑盧 乙吳勝雅ψmocki -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.121.221.213

05/13 17:36, , 1F
(  ̄ c ̄)y▂ξ
05/13 17:36, 1F

05/13 17:38, , 2F
多謝l大的教學!又多學到很多知識了!
05/13 17:38, 2F

05/13 17:41, , 3F
上一篇說的組語, 是在整數型別沒有 padding 的情況下
05/13 17:41, 3F

05/13 17:41, , 4F
才適用, 如果加上 char 是無號數就又不一樣了, 總之
05/13 17:41, 4F

05/13 17:41, , 5F
原來loveme00835大大也是深藏不漏的高人!!!
05/13 17:41, 5F

05/13 17:42, , 6F
char是給你存字元的, 存整數請用signed char/unsigned
05/13 17:42, 6F

05/13 17:42, , 7F
char. 我不是, 我只是愛看小說(規格書)的書呆子
05/13 17:42, 7F

05/13 18:00, , 8F
修改一下 ^^
05/13 18:00, 8F
※ 編輯: loveme00835 來自: 140.121.221.213 (05/13 18:02)
文章代碼(AID): #1Fhtn9rR (C_and_CPP)
討論串 (同標題文章)
本文引述了以下文章的的內容:
4
30
完整討論串 (本文為第 2 之 3 篇):
4
30
文章代碼(AID): #1Fhtn9rR (C_and_CPP)