84669 Lernen von Personen
152542 Lernen von Personen
20005 Lernen von Personen
5487 Lernen von Personen
7821 Lernen von Personen
359900 Lernen von Personen
3350 Lernen von Personen
180660 Lernen von Personen
48569 Lernen von Personen
18603 Lernen von Personen
40936 Lernen von Personen
1549 Lernen von Personen
1183 Lernen von Personen
32909 Lernen von Personen
比如在处理问题:“如何不使用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