比如在处理问题:“如何不使用sizeof()用C程序获得系统字长?”
即便在64位机上,使用过的C编译器也会将int编译为32位。那么如何在C中设置,使得int编译字长和系统字长相同呢?
业精于勤,荒于嬉;行成于思,毁于随。
在Linux上用GCC編譯,32位元機的long是4位元組,64位元機的long是8位元組。
在VS上搜尋了一下巨集INT_MAX的定義,似乎只有一處,是2147483647,所以應該沒有辦法設定了吧,只能自己定義一個型別了。
INT_MAX
2147483647
而且我了解到通常有些項目都不會直接使用預設類型,而是重新定義一組類型來使用,例如我就可以這樣定義一組類型:
#ifdef m32 typedef int SpacelanInt; typedef float SpacelanFloat; #else typedef long int SpacelanInt; typedef double SpacelanFloat; #endif
你不能「設定」int的字長,這玩意兒本來就不是能設定的東西。 但大多數C的實作裡long的字長等於機器字長,前提是你產生的是“native binary”,例如在64位元系統裡產生64位元的程式。 另外,pointer/intptr_t/uintptr_t的字長一般也等於機器字長。
int
long
intptr_t
uintptr_t
當然,在51之類的單晶片上或16位的古老系統裡完全不是這麼回事
在不同平台(x86, x64等)和不同的編譯器上使用的資料模型是不一樣的, 具體可以參考:http://en.wikipedia.org/wiki/64-bit_computing# 64-bit_data_models
另外想拿到跟機器字長一樣的資料結構的話, 可以用size_t
我用VC 2010也是沒辦法配置產生64位元程式,但別人就有這個選項.不過想想現在這個選項也沒沒什麼意思,大多數人都是32位元系統,就算為了64位那一丁點的性能提升我猜也幾乎是跟32位沒差別
__int64 j;
http://baike.baidu.com/item/int64
一般編譯器自帶的頭檔有__int32、int32、int32_t之類的typedef,可以確保是32位元的,但如果程式碼跨編譯器就會出問題,還需要自己包裝一下。
#include <stdint.h>
裡面有intptr_t
在Linux上用GCC編譯,32位元機的long是4位元組,64位元機的long是8位元組。
在VS上搜尋了一下巨集
INT_MAX
的定義,似乎只有一處,是2147483647
,所以應該沒有辦法設定了吧,只能自己定義一個型別了。而且我了解到通常有些項目都不會直接使用預設類型,而是重新定義一組類型來使用,例如我就可以這樣定義一組類型:
你不能「設定」
int
的字長,這玩意兒本來就不是能設定的東西。但大多數C的實作裡
long
的字長等於機器字長,前提是你產生的是“native binary”,例如在64位元系統裡產生64位元的程式。另外,pointer/
intptr_t
/uintptr_t
的字長一般也等於機器字長。當然,在51之類的單晶片上或16位的古老系統裡完全不是這麼回事
在不同平台(x86, x64等)和不同的編譯器上使用的資料模型是不一樣的, 具體可以參考:
http://en.wikipedia.org/wiki/64-bit_computing# 64-bit_data_models
另外想拿到跟機器字長一樣的資料結構的話, 可以用size_t
我用VC 2010也是沒辦法配置產生64位元程式,但別人就有這個選項.不過想想現在這個選項也沒沒什麼意思,大多數人都是32位元系統,就算為了64位那一丁點的性能提升我猜也幾乎是跟32位沒差別
http://baike.baidu.com/item/int64
一般編譯器自帶的頭檔有__int32、int32、int32_t之類的typedef,可以確保是32位元的,但如果程式碼跨編譯器就會出問題,還需要自己包裝一下。
裡面有intptr_t