我最近回答了一个关于SO的问题,并且发现自己在这个过程中对自己的一些事实有点不确定,所以我想对这些事实进行第二次断言:
C和C ++中的整数类型:
char
:一个整数值,大小为1个字节。
short
:一个大小为2个字节的整数值。
long
:一个大小为4个字节的整数值。
long long
:一个大小为8个字节的整数值。
类型short
,long
和long long
通常后跟int
。
然而,这不是必须的,我们可以在没有int
的情况下使用它们。
或者,我们可以只声明int
,但不同的编译器可能对此有不同的解释。
总结一下:
short
与short int
相同,但不一定与int
相同。
long
与long int
相同,但不一定与int
相同。
long long
与long long int
相同,但不一定与int
相同。
在给定的编译器上,int
为short int
或long int
或long long int
。
使用printf
打印整数:
- printf("%d"...)
从堆栈中读取int
值。
- printf("%ld"...)
从堆栈中读取long int
值。
- printf("%lld"...)
从堆栈中读取long long int
值。
所以:
- printf("%ld"...)
将在任何给定平台上读取4个字节。
- printf("%lld"...)
将在任何给定平台上读取8个字节。
- printf("%d"...)
将读取2个字节或4个字节或8个字节,具体取决于给定平台上int
的定义。
上述说明中是否有空洞?
由于
答案 0 :(得分:6)
有几个相当重要的漏洞。
char
总是占用1个字节。这是唯一类型,但保证大小。所有其他字节基本上都是1个或更多字节,并且大到足以容纳指定范围的值(short
或int
为16位,long
为32位,{long long
为64位1}})。
换句话说,你给出的尺寸很常见,但不能保证。
使用printf
:
int
long int
long long int
。如上所述,每个都有指定的最小范围,但不是所需的大小。
同样,标准实际上并没有指定机器有一个堆栈(还有一些,比如IBM大型机和旧的Crays,没有),但如果你只考虑抽象的行为要求,那么你得到的是当然是LIFO(类似堆栈)的要求。
答案 1 :(得分:2)
很多问题.... 很多答案......
OP:long
:一个大小为4个字节的整数值
答:long
是一个整数,最小范围为-2147483647到+2147483647,因此需要至少 32位。
OP:long long
:一个大小为8字节的整数值
答:long long
是一个整数,最小范围为-9223372036854775807到+9223372036854775807,因此需要至少 64位。
OP:类型short
,long
和long long
通常后跟int
。
答:我更频繁地看到short
,long
和long long
,然后使用跟随int
,除非它像C规范一样处于迂腐状态。
答:进一步(不是我的意见):short int i
与short i
相同。 long int i
与long i
相同。 long int i
与long i
相同
答:此外:short signed int i
与short i
相同。 short
,signed
,int
可能以任何顺序出现,结果相同。
OP:但这不是必须的,我们可以在没有int
的情况下使用它们
答:是的。往上看。
OP:或者,我们可以只说明int
,但不同的编译器可能会对此有不同的解释
答:尺寸/范围可能会发生变化,但short
与signed short
相同,signed short int
与signed int
相同。这适用于'long'和'long long',但不适用于'char'。
OP:short
与short int
相同,但不一定与int
相同。
答:是的。
OP:long
与long int
相同,但不一定与int
相同。
答:是的。
OP:long long与long long int相同,但不一定与int相同。
答:是的。
OP:在给定的编译器上,int
为short int
或long int
或long long int
。
答:不可以。所有4可能是不同的尺寸/范围。
OP:-printf(“%d”...)从堆栈中读取int
值
OP:-printf(“%ld”...)从堆栈中读取long int
值
OP:-printf(“%lld”...)从堆栈中读取long long int
值
答:是的 - 存在“堆叠”以外的其他机制。最好考虑来自可变参数的int
。
OP:-printf(“%ld”...)将在任何给定平台上读取4个字节
OP:-printf(“%lld”...)将在任何给定平台上读取8个字节
OP:-printf(“%d”...)将读取2个字节或4个字节或8个字节,具体取决于给定平台上int的定义。
答:不可以。long
的大小至少与int
一样多。 long long
的大小至少与long
一样多。读取的字节数取决于平台。
C中“字节”的定义是“可寻址的数据存储单元,其大小足以容纳执行环境的基本字符集的任何成员”。所以sizeof(char)
- > 1或C
用语1个字节,无论是8,9,32还是其他位大小。
在更大的世界中,许多人认为“字节”是8位。这两个“字节”定义可能会混淆。在谈论C
时,我更喜欢说“短片的大小为4”,意思是sizeof(int)
- > char
的4倍或两倍,不使用“byte”一词。
答案 2 :(得分:1)
您的一些断言不正确,因为它们因平台而异。要确认您的类型的宽度,请打开limits.h
和float.h
文件。您也可以使用sizeof
运算符。
请记住,char
总是一个字节,无论它有多少位。也就是说,在某些机器上char
是8位而在另一台机器上char
是16位。在每种情况下,它被认为是一个字节。其他类型是char
的倍数。
答案 3 :(得分:0)