我正在寻找有关基本C++类型大小的详细信息.我知道这取决于架构(16位,32位,64位)和编译器.
但是有没有C++的标准?
我在32位架构上使用Visual Studio 2008.这是我得到的:
char : 1 byte short : 2 bytes int : 4 bytes long : 4 bytes float : 4 bytes double: 8 bytes
我试图找到,但没有成功,可靠的信息,表述的大小char
,short
,int
,long
,double
,float
(和其他类型的我没想到的),在不同的体系结构和编译器.
C++标准没有以字节为单位指定整数类型的大小,但它指定了它们必须能够容纳的最小范围.您可以从所需范围推断出最小位数.您可以从中推断出以字节为单位的最小大小以及定义字节中位数的CHAR_BIT
宏的值(除了最模糊的平台之外,它都是8,并且它不能小于8).
一个额外的约束char
是它的大小总是1个字节,或CHAR_BIT
位(因此名称).
标准要求的最小范围(第22页)是:
和MSDN上的数据类型范围:
signed char
:-127到127(注意,不是-128到127;这可以容纳1个补码和符号和大小的平台)
unsigned char
:0到255
"plain" char
:与signed char
or 相同的范围,或者unsigned char
是实现定义的
signed short
:-32767至32767
unsigned short
:0到65535
signed int
:-32767至32767
unsigned int
:0到65535
signed long
:-2147483647至2147483647
unsigned long
:0到4294967295
signed long long
:-9223372036854775807至9223372036854775807
unsigned long long
:0到18446744073709551615
C++(或C)实现可以将字节的大小(以字节sizeof(type)
为单位)定义为任何值,只要
表达式sizeof(type) * CHAR_BIT
求值为足够高的位数以包含所需的范围,并且
类型的排序仍然有效(例如sizeof(int) <= sizeof(long)
).
实际的特定于实现的范围可以char
在C 中的头文件中找到,或者signed char
在C++中找到(或者甚至更好,unsigned char
在signed short
头文件中模板化).
例如,您将找到以下内容的最大范围unsigned short
:
C:
#includeconst int min_int = INT_MIN; const int max_int = INT_MAX;
C++:
#includeconst int min_int = std::numeric_limits ::min(); const int max_int = std::numeric_limits ::max();
对于32位系统,"事实上"标准是ILP32 - 也就是说int
,long
指针都是32位数量.
对于64位系统,主要的Unix'事实上'标准是LP64 - long
指针是64位(但是int
是32位).在Windows 64位标准是LLP64 - long long
和指针是64位(但long
并int
都是32位).
有一段时间,一些Unix系统使用了ILP64组织.
这些事实上的标准都没有通过C标准(ISO/IEC 9899:1999)立法,但所有标准都是允许的.
而且,顾名思义,sizeof(char)
就是1
,尽管在Perl的配置脚本测试.
需要注意的是有机器(Crays),其中CHAR_BIT
大于8.这意味着,IIRC大得多,这sizeof(int)
也是1,因为这两个char
和int
是32位.
在实践中没有这样的事情.通常,您可以期望std::size_t
在当前体系结构上表示未签名的本机整数大小.即16位,32位或64位,但在答案的评论中指出并非总是如此.
就所有其他内置类型而言,它实际上取决于编译器.以下是最新C++标准当前工作草案的两个摘录:
有五种标准的有符号整数类型:signed char,short int,int,long int和long long int.在此列表中,每种类型至少提供与列表中前面的存储一样多的存储空间.
对于每个标准有符号整数类型,存在相应的(但不同的)标准无符号整数类型:unsigned char,unsigned short int,unsigned int,unsigned long int和unsigned long long int,每个都占用相同的量存储并具有相同的对齐要求.
如果你愿意,你可以静态(编译时)断言这些基本类型的大小.如果假设的大小发生变化,它会提醒人们考虑移植代码.
有标准.
C90标准要求
sizeof(short) <= sizeof(int) <= sizeof(long)
C99标准要求
sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)
这是C99规格.Page 22详细说明了不同整数类型的大小.
以下是Windows平台的int类型大小(位):
Type C99 Minimum Windows 32bit
char 8 8
short 16 16
int 16 32
long 32 32
long long 64 64
如果您担心可移植性,或者您希望类型的名称反映大小,则可以查看
以下宏可用的标头:
int8_t int16_t int32_t int64_t
int8_t
保证为8位,int16_t
保证为16位等.
如果需要固定大小类型,请使用stdint.h中定义的类型uint32_t(无符号整数32位).它们在C99中指定.
更新:C++ 11将TR1的类型正式纳入标准:
长期的
unsigned long long int
而"大小"类型来自
中int8_t
int16_t
int32_t
的int64_t
(和未签名的同行).
另外你得到:
int_least8_t
int_least16_t
int_least32_t
int_least64_t
加上未签名的同行.
这些类型表示具有至少指定位数的最小整数类型.同样,存在至少具有指定位数的"最快"整数类型:
int_fast8_t
int_fast16_t
int_fast32_t
int_fast64_t
加上未签名的版本.
什么"快速"意味着,如果有的话,取决于实施.它也不一定是所有目的中最快的.
在C++标准说,它是这样的:
3.9.1,§2:
有五种带符号的整数类型:"signed char","short int","int","long int"和"long long int".在此列表中,每种类型至少提供与列表中前面的存储一样多的存储空间.普通的int具有执行环境架构所建议的自然大小(44); 提供其他有符号整数类型以满足特殊需求.
(44)即大到足以包含INT_MIN和INT_MAX范围内的任何值,如标题中所定义
.
结论:这取决于您正在进行的架构.任何其他假设都是错误的.
不,没有类型尺寸的标准.标准仅要求:
sizeof(short int) <= sizeof(int) <= sizeof(long int)
如果你想要固定大小的变量,你可以做的最好的事情是使用这样的宏:
#ifdef SYSTEM_X #define WORD int #else #define WORD long int #endif
然后,您可以使用WORD来定义变量.这不是我喜欢这个,但它是最便携的方式.
我们被允许定义类型的同义词,以便我们可以创建自己的"标准".
在sizeof(int)== 4的机器上,我们可以定义:
typedef int int32; int32 i; int32 j; ...
因此,当我们将代码传输到另一台实际上long int的大小为4的机器时,我们可以重新定义int的单个实例.
typedef long int int32; int32 i; int32 j; ...
对于浮点数,有一个标准(IEEE754):浮点数为32位,双精度数为64.这是一个硬件标准,而不是C++标准,因此编译器理论上可以定义浮点数和加倍到其他大小,但实际上我是从未见过使用过任何不同的建筑.
有一个标准,它在各种标准文件(ISO,ANSI和诸如此类)中指定.
维基百科有一个很棒的页面,解释了它们可以存储的各种类型和最大值: 计算机科学中的整数.
但是,即使使用标准C++编译器,您也可以使用以下代码片段相对轻松地找到它:
#include#include int main() { // Change the template parameter to the various different types. std::cout << std::numeric_limits ::max() << std::endl; }
可以在Roguewave找到std :: numeric_limits的文档.它包含了许多其他命令,您可以调用它们来查找各种限制.这可以与任何传达大小的任意类型一起使用,例如std :: streamsize.
约翰的回答包含最好的描述,因为这些描述可以保证.无论你在哪个平台上,都有另一个好的页面,它详细说明了每种类型必须包含多少位:int类型,它们在标准中定义.
我希望这有帮助!
1)表N1中的文章" 64位程序开发的遗忘问题 "
2)" 数据模型 "
您可以使用:
cout << "size of datatype = " << sizeof(datatype) << endl;
datatype = int
,long int
等等.你将能够看到您键入的数据类型为准大小.
对于不同体系结构和不同编译器的内置类型,只需在您的体系结构上使用编译器运行以下代码,以查看它输出的内容.下面显示了我的Ubuntu 13.04(Raring Ringtail)64位g ++ 4.7.3输出.另请注意下面的答案,这就是为什么输出如此订购:
"有五种标准的有符号整数类型:signed char,short int,int,long int和long long int.在这个列表中,每种类型至少提供与列表中前面一样多的存储空间."
#includeint main ( int argc, char * argv[] ) { std::cout<< "size of char: " << sizeof (char) << std::endl; std::cout<< "size of short: " << sizeof (short) << std::endl; std::cout<< "size of int: " << sizeof (int) << std::endl; std::cout<< "size of long: " << sizeof (long) << std::endl; std::cout<< "size of long long: " << sizeof (long long) << std::endl; std::cout<< "size of float: " << sizeof (float) << std::endl; std::cout<< "size of double: " << sizeof (double) << std::endl; std::cout<< "size of pointer: " << sizeof (int *) << std::endl; } size of char: 1 size of short: 2 size of int: 4 size of long: 8 size of long long: 8 size of float: 4 size of double: 8 size of pointer: 8