当前位置:  开发笔记 > 编程语言 > 正文

C++标准规定了int的大小,long类型是什么?

如何解决《C++标准规定了int的大小,long类型是什么?》经验,为你挑选了14个好方法。

我正在寻找有关基本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(和其他类型的我没想到的),在不同的体系结构和编译器.



1> Alex B..:

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 charor 相同的范围,或者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 charsigned short头文件中模板化).

例如,您将找到以下内容的最大范围unsigned short:

C:

#include 
const int min_int = INT_MIN;
const int max_int = INT_MAX;

C++:

#include 
const int min_int = std::numeric_limits::min();
const int max_int = std::numeric_limits::max();


相反,C++标准使用单词*byte*来表示"1`char`",而不是通常的含义.
@Alex B你在答案中没有提到任何关于双重的内容.你能否更新浮点变量的答案?
@Programmer阅读答案(括号中的第1点注释),或实际标准的措辞(在答案中链接).C标准适用于1的补码架构,它与最广泛的2补码表示不同.最小保证范围几乎总是与实现提供的实际范围不同.
@Cool_Coder:漂浮点是一个额外的水壶鱼,容易加倍的帖子大小.
@user在C++中,`std :: numeric_limits :: min/max()`,在C中,`ULLONG_MIN/MAX`(仅限C99).
链接到的``标准文档''适用于C.
截至本回答之日,有关带符号的char类型的位在[-127..127]范围内是正确的。但是,较新的C ++标准增加了一些语言,以确保“ char”可以表示(至少)256个不同的值。请注意,[-127..127]只有255个不同的值。如果您的`char`类型是带符号的,则它必须能够表示该范围之外的另一个值,因此几乎可以保证所有值都为-128。但这是`char`特有的,而不是其他整数类型。而且我不知道C是否有类似的要求。
@Mooing Duck:“所有版本的C ++都需要256个不同的值(用于带符号字符类型)”,直到在最新的C ++规范中对其进行修复,情况才如此。较早的规范允许带符号的char类型具有不映射到数字的位模式,因此它们缺少必须有256个不同值的要求。“对于无符号字符类型,值表示形式的所有可能的位模式都表示数字。这些要求不适用于其他类型。”

2> Jonathan Lef..:

对于32位系统,"事实上"标准是ILP32 - 也就是说int,long指针都是32位数量.

对于64位系统,主要的Unix'事实上'标准是LP64 - long指针是64位(但是int是32位).在Windows 64位标准是LLP64 - long long和指针是64位(但longint都是32位).

有一段时间,一些Unix系统使用了ILP64组织.

这些事实上的标准都没有通过C标准(ISO/IEC 9899:1999)立法,但所有标准都是允许的.

而且,顾名思义,sizeof(char)就是1,尽管在Perl的配置脚本测试.

需要注意的是有机器(Crays),其中CHAR_BIT大于8.这意味着,IIRC大得多,这sizeof(int)也是1,因为这两个charint是32位.


+1表示在最重要的情况下事物的实际情况,而不是理论上的事情.如果你想要32bit使用int,如果你想要64bit使用long long.如果你想要原生使用size_t.避免"平淡"长,因为它变化.这应该适用于大多数应用程序.
答案为+1.@Eloff:相反......如果你想要32位使用`[u] int32_t`或者类似的话,如果你想要64位使用`[u] int64_t` ...如果你没有标题,下载或制作一个,最好使用这种类型的编译时选择或静态断言来验证大小.http://pubs.opengroup.org/onlinepubs/009695299/basedefs/stdint.h.html如果确切的尺寸不是那么重要而你只关心它们至少那么大,那么你的建议适用于普通的现代PC /服务器平台.
请注意,不只是旧的cray机器具有CHAR_BIT> 8.例如,DSP通常具有16或32的CHAR_BIT.(参见例如[这些](http://processors.wiki.ti.com/index.php/TI_Compilers_and_Industry_Standards#Misunderstandings_about_TI_C ))
@nos:谢谢你的链接.为奇怪的案例确定现代的,现有的系统是非常有帮助的.出于好奇,这些机器上的代码是什么?如果代码集是UTF-16,则0xFFFF不是有效字符,如果代码集是ISO 8859-x代码集,则0xFFFF也不是有效字符(0x00到0xFF的字符代码有效).我还不确定在检测EOF时有问题,但肯定有提醒的空间,可能还有写入和使用函数`int get_char(FILE*fp,char*c)`,它返回EOF或0并设置`*C`.
@joelw:C11要求,给定`uint32_t x = 1,y = 2;``xy`的值在"int"为32位或更小的平台上必须为4294967295,在"int"为"int"的平台上为-1 33位或更大.此外,如果"int"为32位或更小,则要求对x和y的所有值使用模运算来评估`x*y`,如果是65位或更大,则必须使用常规算术,但不对任何要求如果"int"是33到64位,则可能发生大的x和y值.

3> John Leidegr..:

在实践中没有这样的事情.通常,您可以期望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,每个都占用相同的量存储并具有相同的对齐要求.

如果你愿意,你可以静态(编译时)断言这些基本类型的大小.如果假设的大小发生变化,它会提醒人们考虑移植代码.


好帖子.另一件需要的是以下最小位大小(在c89/c99中记录,带有limits.h并由c ++接管):char> = 8,short和int> = 16,long> = 32.

4> yinyueyouge..:

有标准.

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位等.


轻微的挑剔:标准在哪里说'sizeof(long)@JonathonLeffler - 参见C99 5.2.4.2.1 - 整数类型的大小.minsizeof(int)== 16位,minsizeof(long)== 32位,minsizeof(long long)== 64位.所以我认为你是正确的<=因为没有指定maxsizeof(type).

5> Ben..:

如果需要固定大小类型,请使用stdint.h中定义的类型uint32_t(无符号整数32位).它们在C99中指定.


它们是指定的但不是必需的.
@dreamlax哪些平台不包括它?

6> Brian Neal..:

更新: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

加上未签名的版本.

什么"快速"意味着,如果有的话,取决于实施.它也不一定是所有目的中最快的.



7> Jérôme Radix..:

在C++标准说,它是这样的:

3.9.1,§2:

有五种带符号的整数类型:"signed char","short int","int","long int"和"long long int".在此列表中,每种类型至少提供与列表中前面的存储一样多的存储空间.普通的int具有执行环境架构所建议的自然大小(44); 提供其他有符号整数类型以满足特殊需求.

(44)即大到足以包含INT_MIN和INT_MAX范围内的任何值,如标题中所定义 .

结论:这取决于您正在进行的架构.任何其他假设都是错误的.



8> Emiliano..:

不,没有类型尺寸的标准.标准仅要求:

sizeof(short int) <= sizeof(int) <= sizeof(long int)

如果你想要固定大小的变量,你可以做的最好的事情是使用这样的宏:

#ifdef SYSTEM_X
  #define WORD int
#else
  #define WORD long int
#endif

然后,您可以使用WORD来定义变量.这不是我喜欢这个,但它是最便携的方式.


问题是WORD会在程序中传播到并非真正依赖于固定大小的区域(查看一些Windows代码).正如我从16位系统移动到32位系统时发现的那样,你最终遇到的问题是WORD要解决的问题.
你可以做的最好的事情就是`#include `

9> milan-j..:

我们被允许定义类型的同义词,以便我们可以创建自己的"标准".

在sizeof(int)== 4的机器上,我们可以定义:

typedef int int32;

int32 i;
int32 j;
...

因此,当我们将代码传输到另一台实际上long int的大小为4的机器时,我们可以重新定义int的单个实例.

typedef long int int32;

int32 i;
int32 j;
...



10> Crashworks..:

对于浮点数,有一个标准(IEEE754):浮点数为32位,双精度数为64.这是一个硬件标准,而不是C++标准,因此编译器理论上可以定义浮点数和加倍到其他大小,但实际上我是从未见过使用过任何不同的建筑.


但是,符合IEEE 754(又名IEC 559)在C++中是可选的(可能也是C,但我不确定).请参见std :: numeric_limits :: is_iec559.

11> X-Istence..:

有一个标准,它在各种标准文件(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类型,它们在标准中定义.

我希望这有帮助!



12> 小智..:

1)表N1中的文章" 64位程序开发的遗忘问题 "

2)" 数据模型 "



13> Population X..:

您可以使用:

cout << "size of datatype = " << sizeof(datatype) << endl;

datatype = int,long int等等.你将能够看到您键入的数据类型为准大小.



14> bjackfly..:

对于不同体系结构和不同编译器的内置类型,只需在您的体系结构上使用编译器运行以下代码,以查看它输出的内容.下面显示了我的Ubuntu 13.04(Raring Ringtail)64位g ++ 4.7.3输出.另请注意下面的答案,这就是为什么输出如此订购:

"有五种标准的有符号整数类型:signed char,short int,int,long int和long long int.在这个列表中,每种类型至少提供与列表中前面一样多的存储空间."

#include 

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

推荐阅读
家具销售_903
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有