smallint to integer |
尚未結案
|
benson5033
一般會員 發表:44 回覆:47 積分:18 註冊:2004-08-16 發送簡訊給我 |
|
wyndog
資深會員 發表:7 回覆:362 積分:348 註冊:2004-10-12 發送簡訊給我 |
因為電腦是採用二的補數來紀錄負數的關係
所以在 SmallInt 裡面的,他的數值範圍是 32767 ~ -32768
而 50000(10) 存在記憶體裡會變成 C350(16)
而 -15536 用二的補數系統存在記憶體裡恰好也是 C350(16)
所以,你把 50000 給一個 SmallInt 會變成 -15536
是因為 SmallInt 最大值是 32767,超過的部份,會被當成是負數 再來看 integer,integer 的範圍是 2147483647 ~ -2147483648
所以,-15536 正好就在它的範圍裡,自然不會再被當成 50000 了
OK,上面的長篇大論都是理論,看不懂的話就不要理他了 現在設定有二變數 X: integer; Y: SmallInt;
現在讓 X := 50000; Y := X; 這時你可以發現 Y 變成 -15536;
再來讓 X := Y; X 還是 -15536; 這不是你用的,所以我們有二種方法: 法一:
X := 65536 Y; // 利用數學的方法 法二:
X := 0; // 因為 SmallInt 有 2bytes, integer 卻有 4bytes,所以先歸零
Move(Y, X, sizeof(Y)); // 既然記憶體的存法一樣,就直接複製過去就行了
|
Vicen
高階會員 發表:13 回覆:145 積分:151 註冊:2005-03-14 發送簡訊給我 |
其实这个并不是能否转换的问题,而是概念问题,Integer 整数类型 使用4字节存储,最大值-最小值是:-2147483648到2147483647,而SmallInt使用2字节存储,其值范围是 -32768到32767。 也就是50000转换为SmallInt后已经超过其极限范围,属于溢出非正常情况。 建议在程序设计时,如果没有特殊需要或者你对你需要出来整数的大小没有把握不要使用SmallInt之类的类型,毕竟现在的计算机配置比以前的计算机高太多,也无需太过在意节省内存开销,当然随着程序写作的经验积累,等熟练后在去考虑优化资源占用等问题会更好。 个人觉得利用任何方法去做类似的转换在实际应用中可能并没有太大意义,而且多于的转换代码可能会给程序带来更多不可预计的错误。 發表人 - Vicen 於 2005/04/29 11:07:12
|
benson5033
一般會員 發表:44 回覆:47 積分:18 註冊:2004-08-16 發送簡訊給我 |
引言: 因為電腦是採用二的補數來紀錄負數的關係 所以在 SmallInt 裡面的,他的數值範圍是 32767 ~ -32768 而 50000(10) 存在記憶體裡會變成 C350(16) 而 -15536 用二的補數系統存在記憶體裡恰好也是 C350(16) 所以,你把 50000 給一個 SmallInt 會變成 -15536 是因為 SmallInt 最大值是 32767,超過的部份,會被當成是負數 再來看 integer,integer 的範圍是 2147483647 ~ -2147483648 所以,-15536 正好就在它的範圍裡,自然不會再被當成 50000 了 OK,上面的長篇大論都是理論,看不懂的話就不要理他了 現在設定有二變數 X: integer; Y: SmallInt; 現在讓 X := 50000; Y := X; 這時你可以發現 Y 變成 -15536; 再來讓 X := Y; X 還是 -15536; 這不是你用的,所以我們有二種方法: 法一: X := 65536 Y; // 利用數學的方法 法二: X := 0; // 因為 SmallInt 有 2bytes, integer 卻有 4bytes,所以先歸零 Move(Y, X, sizeof(Y)); // 既然記憶體的存法一樣,就直接複製過去就行了但是如果X超過了65536那就有問題了! 兩個方法都有問題,怎麼辦呢? |
Vicen
高階會員 發表:13 回覆:145 積分:151 註冊:2005-03-14 發送簡訊給我 |
|
wyndog
資深會員 發表:7 回覆:362 積分:348 註冊:2004-10-12 發送簡訊給我 |
|
benson5033
一般會員 發表:44 回覆:47 積分:18 註冊:2004-08-16 發送簡訊給我 |
引言:哎~~說來話長,因為另一個程式是別人寫的,沒有source code,而我的程式是要接受它傳進來的變數,所以才會這麼麻煩。引言: 但是如果X超過了65536那就有問題了! 兩個方法都有問題,怎麼辦呢?超過 65536 就沒救啦,65536 在記憶體裡的存法是 $10000 怎麼樣都無法存在 SmallInt 裡啊 所以你還是乖乖用 integer 就好啦 不然就是得用 2個 SmallInt 來組合 重點是,為什麼一定要用 SmallInt 來表示 integer 呢? 如果有適當的理由出來,或許我們才可以想出比較好的處理方式 |
Vicen
高階會員 發表:13 回覆:145 積分:151 註冊:2005-03-14 發送簡訊給我 |
|
benson5033
一般會員 發表:44 回覆:47 積分:18 註冊:2004-08-16 發送簡訊給我 |
|
Vicen
高階會員 發表:13 回覆:145 積分:151 註冊:2005-03-14 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |