C和C 中的整数类型及其用PrintF进行解释

Integer types in C and C++, and their interpretation by printf

本文关键字:PrintF 解释 整数 类型      更新时间:2023-10-16

我最近回答了一个问题,发现自己在此过程中自己有些不确定一些事实,所以我想对这些事实进行第二次主张:ol>

  • 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

  • 使用printf打印整数:

    -printf("%d"...)从堆栈中读取int值。

    -printf("%ld"...)从堆栈中读取long int值。

    -printf("%lld"...)从堆栈读取long long int值。

    so:

    -printf("%ld"...)将在任何给定平台上读取4个字节。

    -printf("%lld"...)将在任何给定平台上读取8个字节。

    -printf("%d"...)将读取2个字节或4个字节或8个字节,具体取决于给定平台上的int的定义。

  • 上面的描述中是否有任何空腔?

    谢谢

    有几个相当大的漏洞。

    a char总是占1个字节。那就是保证大小的类型。所有其他基本上都是1个或以上的字节,并且足够大,可以容纳指定的值范围(shortint的16位,long的32位,long long的64位。

    )。

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

    使用printf

    • "%d"指定int
    • "%ld"指定long int
    • "%lld"指定long long int

    如上所述,它们中的每一个都有指定的最小范围,但没有所需的尺寸。

    同样,该标准实际上并未指定机器具有堆栈(以及一些,例如IBM大型机和旧crays,而不要),尽管如果您仅考虑抽象行为要求,那么您得到的就是

    当然是lifo(类似堆栈)的要求

    许多问题....
    许多答案....

    op: long:大小为4个字节的整数值。
    答:long是一个整数,最小范围为-2147483647至 2147483647,因此它需要在最少 32位。

    op: long long:大小为8字节的整数值。
    答:long long是一个整数,最小范围为-922372036854775807至 922233720372036854775807,因此需要在 64位。

    op:类型shortlonglong long之后是int
    答:我本身会更频繁地看到shortlonglong long,然后使用以下int,除非它在像C Spec一样的pectantic使用中。

    答:进一步(不是我的意见):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 int相同,与signed int相同。这与"长"answers"长"answers" char"相关。

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

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

    op:长时间与长时间的长度相同,但不一定与int相同。
    答:是。

    OP:在给定的编译器上,intshort intlong intlong long int
    答:不。所有4个大小都不同/范围。

    op:-printf("%d" ...)从堆栈中读取int值。
    OP:-printf("%ld" ...)从堆栈中读取long int值。
    OP:-printf("%lld" ...)从堆栈中读取long long int值。
    答:是的 - 存在"堆栈"以外的其他机制。最好想到来自variadic参数的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)-> 4或两倍或两倍的 char,而无需使用"字节"。

    您的某些断言不正确,因为它们因平台而异。要确保您的类型宽度,请打开您的limits.hfloat.h文件。您也可以使用sizeof操作员。

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

    您不能确定地说,如果没有咨询限制,则任何整数类型的大小是给定平台的。h和stdint.h。但是,您可以确定printf格式字符串将正确的模式与正确尺寸的整数相关联,用于给定实现。