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

bar*_*nos 2 c c++ printf integer

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

  1. 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.

    • 在给定的编译器上,intshort int或者long 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给定平台上的定义.

上面的描述中是否有蛀洞?

谢谢

Jer*_*fin 6

有几个相当重要的漏洞.

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

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

printf:

  • "%d"指定一个 int
  • "%ld"指定一个 long int
  • "%lld"指定一个long long int.

如上所述,这些中的每一个都具有指定的最小范围,但不是所需的大小.

同样,标准实际上没有指定机器有一个堆栈(还有一些,比如IBM大型机和旧的Crays,没有),但如果你只考虑抽象的行为要求,那么你得到的肯定是LIFO(类似堆栈的要求.