[問題] int可存的變數大小

看板C_and_CPP (C/C++)作者 (yo)時間13年前 (2013/03/31 16:40), 編輯推噓5(5029)
留言34則, 7人參與, 最新討論串1/1
我用的是C++ 因為助教DEMO的數字是超過十位數 所以我用正常數字下去跑的時候都OK 用DEMO數字跑就變成-XXX 是把int改成unsigned int 嗎?? 我改了之後還是不行說>< -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.136.219

03/31 16:40, , 1F
型態換成long試試看?
03/31 16:40, 1F

03/31 16:44, , 2F
int 和 unsigned int 的最大最小差距都是一樣的
03/31 16:44, 2F

03/31 16:45, , 3F
差別只在於他們前面有沒有負號而已
03/31 16:45, 3F

03/31 16:45, , 4F
int 的範圍是–2,147,483,648 to 2,147,483,647
03/31 16:45, 4F

03/31 16:46, , 5F
unsigned int 則是 0 to 4,294,967,295,就只是差在這裡
03/31 16:46, 5F

03/31 16:49, , 6F
欸.....剛剛發現long的範圍和int一樣大,糗了
03/31 16:49, 6F

03/31 16:49, , 7F
換成long long int?
03/31 16:49, 7F

03/31 16:55, , 8F
用 std::numeric_limits<T> 來取得一個型別的所有資訊
03/31 16:55, 8F

03/31 16:56, , 9F
http://goo.gl/3P3UV 不要自己亂猜, 在不同的處理器上
03/31 16:56, 9F

03/31 16:56, , 10F
即使名稱是一樣的內建型態, 能存的值範圍也不同, 尤其
03/31 16:56, 10F

03/31 16:57, , 11F
特別的是雖然 sizeof(T) == 8 也不一定代表全部的 32
03/31 16:57, 11F

03/31 16:57, , 12F
好奇long存在的意義? unsigned long long int 超贊xD
03/31 16:57, 12F

03/31 16:57, , 13F
位元都會被用到, 超過這個值域範圍如果還想要格式化輸
03/31 16:57, 13F

03/31 16:58, , 14F
入到變數裡那就會炸
03/31 16:58, 14F

03/31 17:01, , 15F
視需求使用最 compact 的型別, 不是數值愈大愈好, 雖
03/31 17:01, 15F

03/31 17:02, , 16F
然大一點的數字型別可以做更多的事, 但有時候使用大整
03/31 17:02, 16F

03/31 17:04, , 17F
數或是字串說不定解問題更貼切. 再過幾年大整數就要進
03/31 17:04, 17F

03/31 17:04, , 18F
標準了 http://goo.gl/ejRxl 甚至我會建議使用cstdint
03/31 17:04, 18F

03/31 17:06, , 19F
裡 fixed size integers 或是像 __uint128_t 都能在型
03/31 17:06, 19F

03/31 17:07, , 20F
別上說明更多事情, 多再多 long 並不能解釋它究竟多
03/31 17:07, 20F

03/31 17:07, , 21F
'long'
03/31 17:07, 21F

03/31 17:08, , 22F
受教了 m(_ _)m,原來還要顧慮這麼多......
03/31 17:08, 22F

03/31 17:08, , 23F
修正: sizeof(T) == 4
03/31 17:08, 23F

03/31 19:26, , 24F
在x86 64位元的電腦下的long好像是 8 bytes
03/31 19:26, 24F

03/31 19:33, , 25F
記得以前寫比較低階的程式,常常要算記憶體位址,但是指標在
03/31 19:33, 25F

03/31 19:33, , 26F
32位元的OS上是32bit,到64位元又不一樣,這時候都用long來
03/31 19:33, 26F

03/31 19:34, , 27F
做指標的運算。
03/31 19:34, 27F

03/31 21:44, , 28F
不要用int或long來存指標 除非你想刻意做成無法移植...
03/31 21:44, 28F

03/31 22:04, , 29F
存是不會,算的時候會用
03/31 22:04, 29F

03/31 22:35, , 30F
SUPER LONG
03/31 22:35, 30F

03/31 22:36, , 31F
8-byte long也要用到64-bit compiler才有
03/31 22:36, 31F

03/31 22:37, , 32F
抱歉,compiler要可以編出64-bit binary
03/31 22:37, 32F

04/01 00:47, , 33F
Liunx的話,可以用下面的命令查最大值:
04/01 00:47, 33F

04/01 00:48, , 34F
g++ -E -dM - < /dev/null |grep MAX
04/01 00:48, 34F
文章代碼(AID): #1HL_Pfq1 (C_and_CPP)
文章代碼(AID): #1HL_Pfq1 (C_and_CPP)