c - C 到底有什么标准, char , short , int , long , double , float的大小?

  显示原文与译文双语对照的内容

我正在寻找有关基本 C++ 类型大小的详细信息。

我知道这取决于架构( 16位,32位,64位) 和编译器。

但是 C++ 有什么标准?

我正在使用 Visual Studio 2008的32位架构。 下面是我得到的内容:


char : 1 byte
short : 2 bytes
int : 4 bytes
long : 4 bytes
float : 4 bytes
double : 8 bytes

我试图在不同的架构和编译器中发现 charshortintlongdoublefloat ( 还有其他类型我没有想到)的可靠信息。

时间:

C++ 标准没有以字节为单位指定整型的大小,但它指定了它们必须能够容纳的最小范围。 你可以从所需的范围中推断出最小的大小。 你可以从字节中推断出最小大小,以及 CHAR_BIT 宏的值,定义字节 ( 除了最模糊的平台,它是 8,而且不能小于 8 ) 中的位数。

char的一个附加约束是它的大小总是 1字节,或者 CHAR_BIT 位( 因此名称) 。

所需的最小范围标准 ( 第 22页) 有:

MSDN 上的数据类型范围:

  1. signed char: -127到 127 ( 注意,不是 -128到 127 ;这可以容纳 1's-complement平台
  2. unsigned char: 0到 255
  3. "普通" char: -127到 127或者 0到 255 ( 取决于默认字符 signedness )
  4. signed short: -32767到 32767
  5. unsigned short: 0到 65535
  6. signed int: -32767到 32767
  7. unsigned int: 0到 65535
  8. signed long: -2147483647到 2147483647
  9. unsigned long: 0到 4294967295
  10. signed long long: -9223372036854775807到 9223372036854775807
  11. unsigned long long: 0到 18446744073709551615

C++ ( 或者C ) 实现可以字节为单位定义类型的大小( 以字节为单位),只要

  1. 表达式 sizeof(type) * CHAR_BIT 计算的位数足以包含所需的范围,并且
  2. 类型的排序仍然有效( 例如。 sizeof(int) <= sizeof(long) ) 。

C 中的实际implementation-specific范围 <limits.h> 头中可以找到,或者在 C++ <climits> ( 在 <limits> header,或者更好的是,模板化 std::numeric_limits ) 。

例如你将如何找到 int的最大范围:

磅:


#include <limits.h>
const int min_int = INT_MIN;
const int max_int = INT_MAX;

C++:


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

对于 32位 系统,'实际因素'标准是 ILP32 —,即 intlong 和指针都是 32位 量。

对于 64位 系统,主 Unix'实际因素'标准是 LP64 — long,指针是 64位 ( 但是 int 是 32 -bit ) 。 Windows 64位 标准是 LLP64 — long long,指针是 64位 ( 但是 longint 都是 32 -bit ) 。

一次,一些Unix系统使用了ILP64组织。

这些事实上的标准都不是legislated标准( iso/iec 9899: 1999 )的,但它们都是允许的。

根据定义,sizeof(char)1,尽管在 Perl configure脚本中有测试。

注意,有机器( Crays ),其中 CHAR_BIT 大于 8. 也就是说,IIRC也是 1,因为 charint 都是 32 -bit 。

实际上,没有这样的事情。 你可以期望 std::size_t 在当前架构中总是表示无符号的原生整数大小。 换句话说,16位,32位 或者 64 -bit 。

但是对于所有其他内置类型,它真的依赖于编译器。 以下是最新 C++ 标准的工作草案摘录:

有五种标准有符号整数类型: 有符号字符,短整型,int,长整型和长整型。 在list,在这个列表中,每个类型提供了至少也有许多存储为那些前面的管它,

对于每个标准有符号整数类型,存在一个对应的( 但不同) 标准无符号整数类型: 无符号字符,无符号短整型,无符号整型,无符号长整型和无符号长整型,它们都占用相同的存储量,并且具有相同的对齐要求。

如果你想你可以静态地( compile-time ) 断言这些基本类型的大小。 它将提醒人们在大小假设改变时,考虑移植你的代码。

有标准的。

C90标准要求


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

C99标准要求


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

这里是规范 。 第 22页不同整型的大小大小。

以下是( 位) Windows 平台的int类型大小:


Type C99 Minimum Windows 32bit
char 8 8
short 16 16
int 16 32
long 32 32
long long 64 64

如果你关心可移植性,或者希望该类型的名称反映大小,可以查看标题 <inttypes.h>,其中包含以下宏:


int8_t
int16_t
int32_t
int64_t

int8_t 保证为 8位,并且 int16_t 保证为 16位等。

如果你需要固定大小类型使用类型像 uint32_t ( 无符号整数 32位) 中定义 stdint.h,它们是c 99中指定。

更新:C++11正式将类型从TR1引入标准:

  • 长整型
  • 无符号长整型

"大小"类型来自 <cstdint>

  • 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
  • 加上未签名的版本。

"快速"意味着什么,如果有的话,取决于实现。 对于所有目的,它都不是最快的。

没有,类型大小没有标准。 标准只要求:


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

如果你想要固定大小的变量,最好的方法是使用这样的宏:


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

然后你可以使用单词来定义变量。 它不是,我喜欢这个,但它是绝大多数便携式方法。

C++ 标准说那么这个词就像

3 。9.1,§2:

有五个有符号整数类型: "有符号字符","短 int","int","long int"还有,"long long"。 在list,在这个列表中,每个类型提供了至少也有许多存储为那些前面的管它, 普通的int有作者建议的原始大小架构的执行环境( 44 ) ;另有符号整数马达产品供你选择,以满足特殊需要。

( 44 ) 即中定义的足够大,以包含INT_MIN和INT_MAX的范围内的任何值,如页眉 <climits>

结论:这取决于你正在使用哪种架构。 任何其他假设都是假的。

我们可以为类型定义一个同义词,这样我们就可以创建自己的"标准"。

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


typedef int int32;

int32 i;
int32 j;
...

因此,当我们将代码传输到一个不同的机器,它实际上是 4的大小,那么我们就可以重新定义int的单个出现。


typedef long int int32;

int32 i;
int32 j;
...

我知道这并不直接回答问题,但我希望它对某人有用。

有一个标准,它是在各种标准文档( ISO,ANSI等) 中指定的。

Wikipedia有一个很棒的页面,解释了各种类型以及它们可能存储的最大值: 计算机科学中的整数。

即使使用标准的C++ 编译器,你也可以使用以下代码Fragment轻松地找到:


#include <iostream>
#include <limits>


int main() {
//Change the template parameter to the various different types.
 std::cout <<std::numeric_limits<int>::max() <<std::endl;
}

std::numeric_limits的文档可以在 Roguewave 。txt中找到。 它包含了很多其他命令,你可以调用它们来找出各种限制。 这可以与任何传递大小的任意类型一起使用,例如 std::streamsize 。

john的回答包含了最好的描述,因为它们保证。 无论你使用的平台是什么,都有另外一个好的页面,它将详细介绍每个类型必须包含多少位: int类型,它在标准中定义。

我希望这可以帮助你!

...