Re: [問題] long v.s long long int

看板C_and_CPP作者 (躂躂..)時間14年前 (2011/06/09 19:03), 編輯推噓1(102)
留言3則, 3人參與, 最新討論串3/4 (看更多)
※ 引述《tropical72 (藍影)》之銘言: : : 我用的是linux 64bit : 簡單的說,早期是可以用 int 去判斷 cpu bit 數, : 據悉 M$ 首度打破了這規則,它使用的是 LLP64, : 很難想像吧!即使在 64 位元 cpu 下,sizeof(long) = sizeof(int) = 4 !! : 所以現在用這方式去取 cpu bit 數也不是很準。 本來就不該用 sizeof(int)在判斷吧 囧 而且 gcc-x64 也是你所謂的 LP64 (sizeof(int) == 4) 並不是只有微軟這樣 : 1. 不是 64 位元電腦,跑程式就以 64 位元變數較快,一律都是跑 int 較快! : 所以 windows 底下,在 64 位元 CPU 下,也是跑 32 bits 之 int 較快。 願聞其詳 @@? : 2. 沒記錯的話,規格中只有規定 : sizeof(int) <= sizeof(long int) <= sizeof(long long int) : 另 sizeof(float) = 4, sizeof(double)=8 , 這二支是固定的, : 唯一關係為 : sizeof(long double) >= sizeof(double) : 至於 long double / double / float 在運算速度上之差別, : 於此便不再贅述, 因確實又要花點篇幅說明。 [6.3.1.1] rank: long long > long > int > short > char long double > double > float spec只定了rank較小value range的是較大的subset [6.2.5-8] 並只定了range limit, 如果簡化成以byte-size來說的話, [5.2.4.2 Numerical limits] char = 1, int = short >= 2, long >= 4, long long >= 8 [6.5.3.4-3 sizeof(char) results 1] float/double 也只是定value range 下限, 沒有說一定是4/8 基本際上這些data type怎麼實作, 會看 compiler 是跟著哪一個 ABI/convention 規範在走 這樣才能確保 compilers 間 (不同vender或不同版本) 的相容性 當然 ABI 怎麼訂, 會考慮cpu architecture 像 ARM 有 ARM EABI 在 Procedure Call Standard for the ARM Architecture 有範規 http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042d/ IHI0042D_aapcs.pdf gcc-x64是走 System V Application Binary Interface AMD64 Architecture Processor Supplement 的範規 http://x86-64.org/documentation/abi.pdf Microsoft VC 可以查 x64 Software Conventions http://msdn.microsoft.com/en-us/library/02c56cw3.aspx -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 1.169.170.127

06/10 07:44, , 1F
rank那裏是 >=
06/10 07:44, 1F

06/10 15:09, , 2F
謝謝補充與指正,受教了!
06/10 15:09, 2F

06/10 22:11, , 3F
hi tropical72, gcc-x64 long我講錯了..你才是對的 orz
06/10 22:11, 3F
文章代碼(AID): #1DyHaTxh (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1DyHaTxh (C_and_CPP)