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) >= 2
和sizeof(long) >= 4
。
首先,这是正确的吗?如果是这样,标准中的内容在哪里?
答案 0 :(得分:10)
不,并非总是如此。 char
可能是64位类型,在这种情况下sizeof(int)
和sizeof(long)
都可以为1.
但您可以保证sizeof(int) * CHAR_BIT >= 16
和sizeof(long) * CHAR_BIT >= 32
,因为int
和long
分别至少需要16位和32位。
答案 1 :(得分:1)
第一:不,这是错的。既然这是错的,标准并没有说它是......;)
[如果按字节我们指的是8位单位,而不是规范的char
大小单位,那么int_least16_t
至少是2个字节是正确的,因为它必须是至少16位,当然int_least32_t
的4个字节对于8位字节也是如此 - 但是C和C ++规范没有说明是char
,它被认为是最小的单位并经常字节[sizeof(char)
可互换使用,保证提供1
]]
标准的唯一规定是:
sizeof(char) <= sizeof(int) <= sizeof(long)
[至少就此而言]。int
至少可以保留16位,long
至少可以保存32位。此后的所有实现都很好。对于24位char
,系统的int
可以为int
,而对于48位sizeof(long) == 2
,{size}(long
)= {1} This is my result:
完全有效。或者所有类型都是32,40,48,64,80,96或128位的那种。
答案 2 :(得分:0)
char
不能有填充位。因此,CHAR_MIN
和CHAR_MAX
必须跨越CHAR_BIT >= 8
定义的整个空间。如果为CHAR_BIT == 16
,则CHAR_MIN == 0
的{{1}}或CHAR_MIN == 0x8000
和CHAR_MAX == 0xFFFF
或CHAR_MAX == 0x7FFF
为char
而signed
为char
分别表示2的补码。unsigned
是EOF
中定义的int,不能用<stdio.h>
表示。即char
总是返回if (EOF == (char)EOF)
。false
,主要是EOF
的标准库,都需要sizeof(int)> sizeof(char)<stdio.h>
在宿主环境中sizeof(int) >= 2
有效。这是因为sizeof(int) == 1
仅需要在托管环境中实现。