sizeof(int)> = 2和sizeof(long)> = 4:对于任何实现,这总是如此吗?

时间:2015-07-25 18:51:02

标签: c++

B.Stroustrup在他的新书(TCPL第4版)第6.2.8节中说明如下:

  

C ++的基本类型的一些方面,例如a的大小   int,是实现定义的(第6.1节)。

稍后,在第150页,我们有以下示例:

int_least16_t y; // at least 2 bytes (just like int)
int_least32_t yy // at least 4 bytes (just like long)

我对这两条评论的解释是int(或long)的大小是实现定义的,但它们的最小大小总是分别等于2和4个字节。对于任何实现,即sizeof(int) >= 2sizeof(long) >= 4

首先,这是正确的吗?如果是这样,标准中的内容在哪里?

3 个答案:

答案 0 :(得分:10)

不,并非总是如此。 char可能是64位类型,在这种情况下sizeof(int)sizeof(long)都可以为1.

但您可以保证sizeof(int) * CHAR_BIT >= 16sizeof(long) * CHAR_BIT >= 32,因为intlong分别至少需要16位和32位。

答案 1 :(得分:1)

第一:不,这是错的。既然这是错的,标准并没有说它是......;)

[如果按字节我们指的是8位单位,而不是规范的char大小单位,那么int_least16_t至少是2个字节是正确的,因为它必须是至少16位,当然int_least32_t的4个字节对于8位字节也是如此 - 但是C和C ++规范没有说明是char,它被认为是最小的单位并经常字节[sizeof(char)可互换使用,保证提供1]]

标准的唯一规定是:

  1. sizeof(char) <= sizeof(int) <= sizeof(long) [至少就此而言]。
  2. int至少可以保留16位,long至少可以保存32位。
  3. 此后的所有实现都很好。对于24位char,系统的int可以为int,而对于48位sizeof(long) == 2,{size}(long)= {1} This is my result:完全有效。或者所有类型都是32,40,48,64,80,96或128位的那种。

答案 2 :(得分:0)

  1. char不能有填充位。因此,CHAR_MINCHAR_MAX必须跨越CHAR_BIT >= 8定义的整个空间。如果为CHAR_BIT == 16,则CHAR_MIN == 0的{​​{1}}或CHAR_MIN == 0x8000CHAR_MAX == 0xFFFFCHAR_MAX == 0x7FFFcharsignedchar分别表示2的补码。
  2. unsignedEOF中定义的int,不能用<stdio.h>表示。即char总是返回if (EOF == (char)EOF)
  3. 任何需要false,主要是EOF的标准库,都需要sizeof(int)> sizeof(char)
  4. 大于1的最小值是2,因此<stdio.h>在宿主环境中
  5. 自由环境中的
  6. sizeof(int) >= 2有效。这是因为sizeof(int) == 1仅需要在托管环境中实现。