我正在寻找有关基本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
Run Code Online (Sandbox Code Playgroud)
我试图找到,但没有成功,可靠的信息,表述的大小char
,short
,int
,long
,double
,float
(和其他类型的我没想到的),在不同的体系结构和编译器.
Ale*_*x B 669
C++标准没有以字节为单位指定整数类型的大小,但它指定了它们必须能够容纳的最小范围.您可以从所需范围推断出最小位数.您可以从中推断出以字节为单位的最小大小以及定义字节中位数的CHAR_BIT
宏的值(除了最模糊的平台之外,它都是8,并且它不能小于8).
一个额外的约束char
是它的大小总是1个字节,或CHAR_BIT
位(因此名称).
标准要求的最小范围(第22页)是:
和MSDN上的数据类型范围:
signed char
:-127到127(注意,不是-128到127;这可以容纳1个补码和符号和大小的平台)unsigned char
:0到255char
:与signed char
or 相同的范围,或者unsigned char
是实现定义的signed short
:-32767至32767unsigned short
:0到65535signed int
:-32767至32767unsigned int
:0到65535signed long
:-2147483647至2147483647unsigned long
:0到4294967295signed long long
:-9223372036854775807至9223372036854775807unsigned long long
:0到18446744073709551615C++(或C)实现可以将字节的大小(以字节sizeof(type)
为单位)定义为任何值,只要
sizeof(type) * CHAR_BIT
求值为足够高的位数以包含所需的范围,并且sizeof(int) <= sizeof(long)
).实际的特定于实现的范围可以char
在C 中的头文件中找到,或者signed char
在C++中找到(或者甚至更好,unsigned char
在signed short
头文件中模板化).
例如,您将找到以下内容的最大范围unsigned short
:
C:
#include <limits.h>
const int min_int = INT_MIN;
const int max_int = INT_MAX;
Run Code Online (Sandbox Code Playgroud)
C++:
#include <limits>
const int min_int = std::numeric_limits<int>::min();
const int max_int = std::numeric_limits<int>::max();
Run Code Online (Sandbox Code Playgroud)
Jon*_*ler 234
对于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位.
Joh*_*ren 88
在实践中没有这样的事情.通常,您可以期望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,每个都占用相同的量存储并具有相同的对齐要求.
如果你愿意,你可以静态(编译时)断言这些基本类型的大小.如果假设的大小发生变化,它会提醒人们考虑移植代码.
yin*_*uge 79
有标准.
C90标准要求
sizeof(short) <= sizeof(int) <= sizeof(long)
Run Code Online (Sandbox Code Playgroud)
C99标准要求
sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)
Run Code Online (Sandbox Code Playgroud)
这是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
Run Code Online (Sandbox Code Playgroud)
如果您担心可移植性,或者您希望类型的名称反映大小,则可以查看<inttypes.h>
以下宏可用的标头:
int8_t
int16_t
int32_t
int64_t
Run Code Online (Sandbox Code Playgroud)
int8_t
保证为8位,int16_t
保证为16位等.
Bri*_*eal 35
更新:C++ 11将TR1的类型正式纳入标准:
而"大小"类型来自 <cstdint>
另外你得到:
这些类型表示具有至少指定位数的最小整数类型.同样,存在至少具有指定位数的"最快"整数类型:
什么"快速"意味着,如果有的话,取决于实施.它也不一定是所有目的中最快的.
Emi*_*ano 12
不,没有类型尺寸的标准.标准仅要求:
sizeof(short int) <= sizeof(int) <= sizeof(long int)
Run Code Online (Sandbox Code Playgroud)
如果你想要固定大小的变量,你可以做的最好的事情是使用这样的宏:
#ifdef SYSTEM_X
#define WORD int
#else
#define WORD long int
#endif
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用WORD来定义变量.这不是我喜欢这个,但它是最便携的方式.
mil*_*n-j 10
我们被允许定义类型的同义词,以便我们可以创建自己的"标准".
在sizeof(int)== 4的机器上,我们可以定义:
typedef int int32;
int32 i;
int32 j;
...
Run Code Online (Sandbox Code Playgroud)
因此,当我们将代码传输到另一台实际上long int的大小为4的机器时,我们可以重新定义int的单个实例.
typedef long int int32;
int32 i;
int32 j;
...
Run Code Online (Sandbox Code Playgroud)
对于浮点数,有一个标准(IEEE754):浮点数为32位,双精度数为64.这是一个硬件标准,而不是C++标准,因此编译器理论上可以定义浮点数和加倍到其他大小,但实际上我是从未见过使用过任何不同的建筑.
有一个标准,它在各种标准文件(ISO,ANSI和诸如此类)中指定.
维基百科有一个很棒的页面,解释了它们可以存储的各种类型和最大值: 计算机科学中的整数.
但是,即使使用标准C++编译器,您也可以使用以下代码片段相对轻松地找到它:
#include <iostream>
#include <limits>
int main() {
// Change the template parameter to the various different types.
std::cout << std::numeric_limits<int>::max() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
可以在Roguewave找到std :: numeric_limits的文档.它包含了许多其他命令,您可以调用它们来查找各种限制.这可以与任何传达大小的任意类型一起使用,例如std :: streamsize.
约翰的回答包含最好的描述,因为这些描述可以保证.无论你在哪个平台上,都有另一个好的页面,它详细说明了每种类型必须包含多少位:int类型,它们在标准中定义.
我希望这有帮助!
您可以使用:
cout << "size of datatype = " << sizeof(datatype) << endl;
Run Code Online (Sandbox Code Playgroud)
datatype = int
,long int
等等.你将能够看到您键入的数据类型为准大小.
对于不同体系结构和不同编译器的内置类型,只需在您的体系结构上使用编译器运行以下代码,以查看它输出的内容.下面显示了我的Ubuntu 13.04(Raring Ringtail)64位g ++ 4.7.3输出.另请注意下面的答案,这就是为什么输出如此订购:
"有五种标准的有符号整数类型:signed char,short int,int,long int和long long int.在这个列表中,每种类型至少提供与列表中前面一样多的存储空间."
#include <iostream>
int 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
Run Code Online (Sandbox Code Playgroud)