比如在处理问题:“如何不使用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