作者loveme00835 (高髮箍)
看板C_and_CPP
標題Re: [問題] char與int
時間Sun May 13 17:17:59 2012
※ 引述《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
≡≡≡≡║ ╚╝ ║║ ╚╝ ║║║║ ║║ ╞╣║ ║║ ║║ ║≡≡≡≡
≡≡≡≡║ ═╣║ ╥ ║║║║ ║ ║║ ═ ║║ ╚╝ ║║ ║ ║≡≡≡≡
≡高佑麗╚═╩═╝╚═╩═╝╚╝╚═╚═╝╚═══╝╚═══╝╚═╩═╝鄭允慧≡
≡≡≡≡≡趙賢榮≡≡≡金智淑≡≡≡RAINBOW≡≡≡盧 乙≡≡≡吳勝雅≡ψ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)