看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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
loveme00835:(  ̄ c ̄)y▂ξ 05/13 17:36
lopohsiung:多謝l大的教學!又多學到很多知識了! 05/13 17:38
loveme00835:上一篇說的組語, 是在整數型別沒有 padding 的情況下 05/13 17:41
loveme00835:才適用, 如果加上 char 是無號數就又不一樣了, 總之 05/13 17:41
lopohsiung:原來loveme00835大大也是深藏不漏的高人!!! 05/13 17:41
loveme00835:char是給你存字元的, 存整數請用signed char/unsigned 05/13 17:42
loveme00835:char. 我不是, 我只是愛看小說(規格書)的書呆子 05/13 17:42
loveme00835:修改一下 ^^ 05/13 18:00
※ 編輯: loveme00835 來自: 140.121.221.213 (05/13 18:02)