Discussion:
[問題] Java真的沒有unsigned primitive type嗎
(时间太久无法回复)
J***@ptt.cc
2007-07-18 11:32:12 UTC
Permalink
因為最近寫程式需要用到 unsigned (int,short...etc)

去Google和精華區都沒有發現 unsigned 基本形態

google是有查到用上一階( short --> int 去模擬unsigned的大小)

查了一下wrapper class也沒有 unsigned 的影子出現

請問一下

有誰知道 unsigned 到底有沒有@@? 感謝解答唷

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 125.231.228.86
※ 編輯: Jimmy0398 來自: 125.231.228.86 (07/18 19:32)
痞子軍團團長
2007-07-18 12:19:34 UTC
Permalink
※ 引述《Jimmy0398 ()》之銘言:
: 因為最近寫程式需要用到 unsigned (int,short...etc)
: 去Google和精華區都沒有發現 unsigned 基本形態
: google是有查到用上一階( short --> int 去模擬unsigned的大小)
: 查了一下wrapper class也沒有 unsigned 的影子出現
: 請問一下
: 有誰知道 unsigned 到底有沒有@@? 感謝解答唷

這個問題好像之前(大概半年前?)也有人問過...

重點是... 你為甚麼需要 unsigned?

如果說你需要的是很大很大的整數,所以希望透過 unsigned 來加持 lol
那麼,我想直接跳用更暴力的 BigInteger 不是更快樂?
(如果效率問題不是非常重要的關鍵點的話)

其他的狀況... 坦白說,我不知道多了 unsigned 能幹麼 @__@
也許有寫 C 出身的神人可以幫忙講解一下... [跪拜之 Orz]


--
 侃侃長論鮮窒礙  首頁:http://www.psmonkey.idv.tw
 眾目睽睽無心顫  Blog:http://ps-think.blogspot.com
 煢居少聊常人事 
 殺頭容易告白難  歡迎參觀 Java 版(@ptt.cc)精華區 \囧/

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.228.200.18
每天進步一點點
2007-07-18 12:46:01 UTC
Permalink
※ 引述《PsMonkey (痞子軍團團長)》之銘言:
: ※ 引述《Jimmy0398 ()》之銘言:
: : 因為最近寫程式需要用到 unsigned (int,short...etc)
: : 去Google和精華區都沒有發現 unsigned 基本形態
: : google是有查到用上一階( short --> int 去模擬unsigned的大小)
: : 查了一下wrapper class也沒有 unsigned 的影子出現
: : 請問一下
: : 有誰知道 unsigned 到底有沒有@@? 感謝解答唷
: 這個問題好像之前(大概半年前?)也有人問過...
: 重點是... 你為甚麼需要 unsigned?
: 如果說你需要的是很大很大的整數,所以希望透過 unsigned 來加持 lol
: 那麼,我想直接跳用更暴力的 BigInteger 不是更快樂?
: (如果效率問題不是非常重要的關鍵點的話)
: 其他的狀況... 坦白說,我不知道多了 unsigned 能幹麼 @__@
: 也許有寫 C 出身的神人可以幫忙講解一下... [跪拜之 Orz]
在一些系統之中作開發,記憶體的使用是非常計較的!!
所以能夠使用最小的記憶體空間,而能做到相同的事情是很重要的!

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.168.197.122
!H45
2007-07-18 13:19:58 UTC
Permalink
※ 引述《tgbsa (每天進步一點點)》之銘言:
: ※ 引述《PsMonkey (痞子軍團團長)》之銘言:
: : 這個問題好像之前(大概半年前?)也有人問過...
: : 重點是... 你為甚麼需要 unsigned?
: : 如果說你需要的是很大很大的整數,所以希望透過 unsigned 來加持 lol
: : 那麼,我想直接跳用更暴力的 BigInteger 不是更快樂?
: : (如果效率問題不是非常重要的關鍵點的話)
: : 其他的狀況... 坦白說,我不知道多了 unsigned 能幹麼 @__@
: : 也許有寫 C 出身的神人可以幫忙講解一下... [跪拜之 Orz]
: 在一些系統之中作開發,記憶體的使用是非常計較的!!
: 所以能夠使用最小的記憶體空間,而能做到相同的事情是很重要的!

雖然你說得很有道理,確實應該使用最小的記憶體空間來做到相同的事情
但是這和 unsigned 有什麼關係?

我記得 unsigned 並沒辦法得到較小的記憶體空間
能否請教如何使用 unsigned 來得到較小的記憶體空間呢?

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.211.211.53
godfat 真常
2007-07-18 13:52:20 UTC
Permalink
※ 引述《H45 (!H45)》之銘言:
: 雖然你說得很有道理,確實應該使用最小的記憶體空間來做到相同的事情
: 但是這和 unsigned 有什麼關係?
: 我記得 unsigned 並沒辦法得到較小的記憶體空間
: 能否請教如何使用 unsigned 來得到較小的記憶體空間呢?

@@
範圍變大一倍,怎麼不會省記憶體?
假設你需要 0~255, 沒有 unsigned, 就不能只用 1 byte 去存了
原本 unsigned int 可以做到的事,變成要用 long
或是要自己試著模擬出 unsigned? 那也未免太麻煩了

有些需要大量使用的東西,能省記憶體還是省點好,因為一次就差一倍
各種奇怪的 hack 就別拿出來討論了,很麻煩,能直接支援的還是直接支援好

記得 unsigned 在 java 開發初期備受討論,最後還是拿掉了
上次看到有個談 java 開發歷史寫的,出處忘了

不過有時候我也會覺得,反正都用 java 了,就別太計較了 :o
要計較還是用 C/C++ 比較容易

--
「行!Loki!」(rocky )

-Gurumin  王子? XD

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.135.28.18
大家來用linux^^/
2007-07-18 14:43:08 UTC
Permalink
※ 引述《***@ptt.cc (godfat 真常)》之銘言:
: ※ 引述《H45 (!H45)》之銘言:
: : 雖然你說得很有道理,確實應該使用最小的記憶體空間來做到相同的事情
: : 但是這和 unsigned 有什麼關係?
: : 我記得 unsigned 並沒辦法得到較小的記憶體空間
: : 能否請教如何使用 unsigned 來得到較小的記憶體空間呢?
: @@
: 範圍變大一倍,怎麼不會省記憶體?
: 假設你需要 0~255, 沒有 unsigned, 就不能只用 1 byte 去存了
: 原本 unsigned int 可以做到的事,變成要用 long
: 或是要自己試著模擬出 unsigned? 那也未免太麻煩了
: 有些需要大量使用的東西,能省記憶體還是省點好,因為一次就差一倍
: 各種奇怪的 hack 就別拿出來討論了,很麻煩,能直接支援的還是直接支援好
: 記得 unsigned 在 java 開發初期備受討論,最後還是拿掉了
: 上次看到有個談 java 開發歷史寫的,出處忘了
: 不過有時候我也會覺得,反正都用 java 了,就別太計較了 :o
: 要計較還是用 C/C++ 比較容易

經過上面兩篇的解釋,我想我已經知道自己的盲點在哪裡了。

本來我一直以為 unsigned int 和普通的 int 存的東西一模一樣
只是最後 scale 的時候一個調到 0 以上,另一個則調到 -XXX ~ YYY 之間

但是這樣完全忘了另一個重要的元素:運算子
unsigned int 的運算子和 int 的運算子實作上不太一樣
舉例而言,乘法和除法在這兩者的運算是完全不同的
而加法和減法則沒有影響。

在此感謝各位先進為我解惑。

--
〒作者:H45 來自:60-248-127-91.HINET-IP.hinet.net
◎二進位的世界【140.115.50.50‧bbs.ncu.cc】
痞子軍團團長
2007-07-18 14:09:01 UTC
Permalink
※ 引述《H45 (!H45)》之銘言:
: ※ 引述《tgbsa (每天進步一點點)》之銘言:
: : 在一些系統之中作開發,記憶體的使用是非常計較的!!
: : 所以能夠使用最小的記憶體空間,而能做到相同的事情是很重要的!
: 雖然你說得很有道理,確實應該使用最小的記憶體空間來做到相同的事情
: 但是這和 unsigned 有什麼關係?
: 我記得 unsigned 並沒辦法得到較小的記憶體空間
: 能否請教如何使用 unsigned 來得到較小的記憶體空間呢?

用 Java 來說...
如果你要用一個變數存 2147483650
那就勢必不能用 32 bit 的 int
而得改用 64 bit 的 long

如果用 unsigned,那就可以依然用 32 bit 來解決這件事情

====
ㄜ... 我只想得到這招

--
 侃侃長論鮮窒礙  首頁:http://www.psmonkey.idv.tw
 眾目睽睽無心顫  Blog:http://ps-think.blogspot.com
 煢居少聊常人事 
 殺頭容易告白難  歡迎參觀 Java 版(@ptt.cc)精華區 \囧/

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.228.200.18
J***@ptt.cc
2007-07-18 15:04:58 UTC
Permalink
※ 引述《PsMonkey (痞子軍團團長)》之銘言:
: ※ 引述《H45 (!H45)》之銘言:
恕刪

真抱歉這麼晚才來回文^^a。

其實會用到 unsigned type ,是因為我需要讀入一個 RAW 圖檔。

其中每個像素是8 Bits,值是0~255。 所以當我把每個值放入一個 Byte Array

時,超過127的會以負值表示。這對我後來的程序有麻煩。

目前已知最快的方法是用 short 等... 但是想要找一個較省容量的方法。

希望大家給點建議^^"

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 125.231.228.86
大家來用linux^^/
2007-07-18 15:24:33 UTC
Permalink
※ 引述《***@ptt.cc ()》之銘言:
: ※ 引述《PsMonkey (痞子軍團團長)》之銘言:
: 恕刪
: 真抱歉這麼晚才來回文^^a。
: 其實會用到 unsigned type ,是因為我需要讀入一個 RAW 圖檔。
: 其中每個像素是8 Bits,值是0~255。 所以當我把每個值放入一個 Byte Array
: 時,超過127的會以負值表示。這對我後來的程序有麻煩。
: 目前已知最快的方法是用 short 等... 但是想要找一個較省容量的方法。
: 希望大家給點建議^^"

那就在運算的時候,把 byte 轉成 short 或是 int
然後運算結束之後,再把 short 或是 int 轉回 byte 再存回 Byte Array

不知道這個方案如何?

--

PTT 發文慢,又系統過載,讓我很想用他站轉信....

--
〒作者:H45 來自:adsl-218-211-211-53.SKH.sparqnet.net
◎二進位的世界【140.115.50.50‧bbs.ncu.cc】
學無止境,啥時才摔到底?
2007-07-18 16:02:09 UTC
Permalink
※ 引述《Jimmy0398 ()》之銘言:
: 其中每個像素是8 Bits,值是0~255。 所以當我把每個值放入一個 Byte Array
: 時,超過127的會以負值表示。這對我後來的程序有麻煩。
: 目前已知最快的方法是用 short 等... 但是想要找一個較省容量的方法。
: 希望大家給點建議^^"

前陣子同事也有類似的困惑,讓他在程式撰寫上懷疑自己是否送錯資料給 Device,
我建議他換個思考方式,也同樣建議您,應該將顯示與儲存分開來看...

只要是整數型別,你將數值印出來一定會因為sign bit而產生正負的差異,
但這一切都是你的幻覺,因為存在byte中的,一定是8個bit不會改變。
你之所以看到會有負值,都是因為轉型的緣故。

譬如下面這段程式:
int a = 255;
byte b = (byte) a;
int c = (int) b;
System.out.println(a);
System.out.println(b);
System.out.println(c);

印出來的結果將會是
255 (直接將int轉為String, 沒問題)
-1 (將byte轉int之後再轉為String)
-1 (將事先轉好的int轉為String)

換言之,你在印出來的過程中,其實是編譯器背後替你轉型,
將1111 11111 轉換為整數 1111 1111 1111 1111 1111 1111 1111 1111

OK! 回歸正題,那你該怎麼做才能看得出來你要的unsign?
簡單來說,就是利用Hex的表示法。

我們來看看Integer物件的某個method...
public static String toHexString(int i)
這個method的說明清楚指出...
Returns a string representation of the integer argument as an unsigned
integer in base 16.

所以,若你對於看到負號不滿意,請用Hex吧!
byte b = (byte) 255 與 byte b = (byte) 0xFF 是一樣的東西,習慣就好了。
能確定自己轉換得沒錯最重要!


--
話說... 最近常會會回文回到不知道自己要表達什麼... ><
也真難為我同事們能聽得懂我的解釋... = =a

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 211.74.122.24
※ 編輯: hougzou 來自: 211.74.122.24 (07/19 00:19)
Loading...