C和C ++中的整数类型,以及它们对printf的解释

时间:2014-01-19 05:36:50

标签: c++ c integer printf

我最近回答了一个关于SO的问题,并且发现自己在这个过程中对自己的一些事实有点不确定,所以我想对这些事实进行第二次断言:

  1. C和C ++中的整数类型:

    • char:一个整数值,大小为1个字节。

    • short:一个大小为2个字节的整数值。

    • long:一个大小为4个字节的整数值。

    • long long:一个大小为8个字节的整数值。

    类型shortlonglong long通常后跟int

    然而,这不是必须的,我们可以在没有int的情况下使用它们。

    或者,我们可以只声明int,但不同的编译器可能对此有不同的解释。

    总结一下:

    • shortshort int相同,但不一定与int相同。

    • longlong int相同,但不一定与int相同。

    • long longlong long int相同,但不一定与int相同。

    • 在给定的编译器上,intshort intlong intlong long int

  2. 使用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的定义。

  3. 上述说明中是否有空洞?

    由于

4 个答案:

答案 0 :(得分:6)

有几个相当重要的漏洞。

char总是占用1个字节。这是唯一类型,但保证大小。所有其他字节基本上都是1个或更多字节,并且大到足以容纳指定范围的值(shortint为16位,long为32位,{long long为64位1}})。

换句话说,你给出的尺寸很常见,但不能保证。

使用printf

  • “%d”指定int
  • “%ld”指定long int
  • “%lld”指定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:类型shortlonglong long通常后跟int
答:我更频繁地看到shortlonglong long,然后使用跟随int,除非它像C规范一样处于迂腐状态。
答:进一步(不是我的意见):short int ishort i相同。 long int ilong i相同。 long int ilong i相同 答:此外:short signed int ishort i相同。 shortsignedint可能以任何顺序出现,结果相同。

OP:但这不是必须的,我们可以在没有int的情况下使用它们 答:是的。往上看。

OP:或者,我们可以只说明int,但不同的编译器可能会对此有不同的解释 答:尺寸/范围可能会发生变化,但shortsigned short相同,signed short intsigned int相同。这适用于'long'和'long long',但不适用于'char'。

OP:shortshort int相同,但不一定与int相同。
答:是的。

OP:longlong int相同,但不一定与int相同。
答:是的。

OP:long long与long long int相同,但不一定与int相同。
答:是的。

OP:在给定的编译器上,intshort intlong intlong 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.hfloat.h文件。您也可以使用sizeof运算符。

请记住,char总是一个字节,无论它有多少位。也就是说,在某些机器上char是8位而在另一台机器上char是16位。在每种情况下,它被认为是一个字节。其他类型是char的倍数。

答案 3 :(得分:0)

如果没有咨询limits.h,可能还有stdint.h,您无法确切地说,给定平台的任何整数类型的大小是多少。但是,您可以确保printf格式字符串将正确的模式与给定实现的堆栈上传递的正确大小的整数相关联。