線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:3331
推到 Plurk!
推到 Facebook!

smallint to integer

尚未結案
benson5033
一般會員


發表:44
回覆:47
積分:18
註冊:2004-08-16

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-04-29 10:03:39 IP:210.62.xxx.xxx 未訂閱
請問各位先進,有一個integer型態的變數,把它轉換為smallint後如何才能 又把它轉換為interger,而且數字是不變的。 例如: 50000轉為smallint後變為-15536,那-15536又怎麼再把它轉回50000呢??
wyndog
資深會員


發表:7
回覆:362
積分:348
註冊:2004-10-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-04-29 10:59:27 IP:60.248.xxx.xxx 未訂閱
因為電腦是採用二的補數來紀錄負數的關係 所以在 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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-04-29 11:01:09 IP:221.226.xxx.xxx 未訂閱
其实这个并不是能否转换的问题,而是概念问题,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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-04-29 11:21:44 IP:210.62.xxx.xxx 未訂閱
引言: 因為電腦是採用二的補數來紀錄負數的關係 所以在 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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-04-29 11:27:29 IP:221.226.xxx.xxx 未訂閱
benson5033你好,其实不太明白你为什么必须将INTEGER->SMALLINT,其实reptile大大说的转换方法有一定的缺陷,因为你并不知道转换值是否在SMALLINT范围内,如果他的值在SMALLINT正常范围内,那么这种转换方法无疑是有很大问题的。最好直接用INTEGER,这个问题就不会存在。
wyndog
資深會員


發表:7
回覆:362
積分:348
註冊:2004-10-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-04-29 11:58:59 IP:60.248.xxx.xxx 未訂閱
引言: 但是如果X超過了65536那就有問題了! 兩個方法都有問題,怎麼辦呢?
超過 65536 就沒救啦,65536 在記憶體裡的存法是 $10000 怎麼樣都無法存在 SmallInt 裡啊 所以你還是乖乖用 integer 就好啦 不然就是得用 2個 SmallInt 來組合 重點是,為什麼一定要用 SmallInt 來表示 integer 呢? 如果有適當的理由出來,或許我們才可以想出比較好的處理方式
benson5033
一般會員


發表:44
回覆:47
積分:18
註冊:2004-08-16

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-04-29 13:48:30 IP:210.62.xxx.xxx 未訂閱
引言:
引言: 但是如果X超過了65536那就有問題了! 兩個方法都有問題,怎麼辦呢?
超過 65536 就沒救啦,65536 在記憶體裡的存法是 $10000 怎麼樣都無法存在 SmallInt 裡啊 所以你還是乖乖用 integer 就好啦 不然就是得用 2個 SmallInt 來組合 重點是,為什麼一定要用 SmallInt 來表示 integer 呢? 如果有適當的理由出來,或許我們才可以想出比較好的處理方式
哎~~說來話長,因為另一個程式是別人寫的,沒有source code,而我的程式是要接受它傳進來的變數,所以才會這麼麻煩。
Vicen
高階會員


發表:13
回覆:145
積分:151
註冊:2005-03-14

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-04-29 13:57:45 IP:221.226.xxx.xxx 未訂閱
呵呵,原来是接受它传来的变数啊,这个就更简单了,它传来的变数是整型的情况下,如果你不知道到底是SmallInt,Integer,LongInt,Int64的话,你就用一个至少LongInt来接收就行了,这样基本上是不会溢出的。
benson5033
一般會員


發表:44
回覆:47
積分:18
註冊:2004-08-16

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-04-29 14:22:37 IP:210.62.xxx.xxx 未訂閱
引言: 呵呵,原来是接受它传来的变数啊,这个就更简单了,它传来的变数是整型的情况下,如果你不知道到底是SmallInt,Integer,LongInt,Int64的话,你就用一个至少LongInt来接收就行了,这样基本上是不会溢出的。
我確定它先將integer轉成smallint再傳過來,所以會有負值,如果我接收的是longint的話,那還是負值。所以就有問題了。
Vicen
高階會員


發表:13
回覆:145
積分:151
註冊:2005-03-14

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-04-29 15:36:32 IP:221.226.xxx.xxx 未訂閱
那就没解了,你只好找他了。
系統時間:2024-05-17 11:41:50
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!