C Primer Plus 6 笔记——可移植类型:stdint.h和inttypes.h

C Primer Plus 6 笔记——可移植类型:stdint.h和inttypes.h

  C语言提供了许多有用的整数类型。但是,某些类型名在不同系统中的功能不一样。C99新增了两个头文件stdint.h和inttypes.h,以确保C语言的类型在各系统中的功能相同。(使用linux的童鞋可以使用sudo find / -name stdint.h(or inttypes.h)找到这两个头文件)
  C语言为现有类型创建了更多类型名。这些新的类型名定义在stdint.h头文件中。例如,int32_t表示32位的有符号整数类型。在使用32位int的系统中,头文件会把int32_t作为int的别名。不同的系统也可以定义相同的类型名。例如,int为16位、long为32位的系统int32_t作为long的别名。然后int32_t类型编写,并包含stdint.h头文件时,编译器会把int或long替换成与当前系统匹配的类型。
  上面讨论的类型别名是精确宽度整数类型(exact-width integer type)的示例。int32_t表示的宽度正好是32位。但是,计算机底层系统可能不支持。因此,精确宽度整数类型是可选项。
  如果系统不支持精确宽度整数类型怎么办?C99和C11提供了第2类别名集合。一些类型名保证所表示的类型一定是至少有指定宽度的最小整数类型。这组类型集合被称为最小宽度类型(minimum width type)。例如,int_least8_t是可容纳8位有符号整数值的类型中宽度最小的类型的一个别名。如果某系统的最小整数类型是16位,可能不会定义int8_t类型。尽管如此,该系统仍可使用int_least8_t类型,但可能把该类型实现为16位的整数类型。
  当然,一些程序员更关心速度而非空间。为此,C99和C11定义了一组可使计算达到最快的类型集合。这组类型集合被称为最快最小宽度类型(fastst minimum width type)。例如,int_fast8_t被定义为系统中对8位有符号值而言运算最快的整数类型的别名。
  另外,有些程序员需要系统的最大整数类型。为此,C99定义了最大的有符号整数类型intmax_t,可以存储任何有效的有符号整数值。类似地,unitmax表示最大的无符号整数类型。顺带一提,这些类型有可能比long long和unsigned long类型更大,因为C编译器除了实现标准规定的类型外,还可以利用C语言实现其他类型。例如,一些编译器在标准引入long long类型之前,已提前实现了该类型。
  C99和C11不仅提供可移植的类型名,还提供相应的输入和输出。例如,printf()打印特定类型是要求与相应的转换说明匹配。如果要打印int32_t类型的值,有些定义使用%d,而有些定义使用%ld,怎么办?C标准针对这一情况,提供了一些字符串宏来显示可移植类型。例如,inttypes.h头文件中定义了PRId32字符串宏,代表打印32位有符号值的合适转换说明(如d或l)。下面用以一个程序演示使用方法。

/* altname.c -- 可移植整数类型名 */
#include <stdio.h> 
#include <inttypes.h>    //支持可移植类型
int main(void)
{
    int32_t me32;        //me32是一个32位有符号整形变量

    me32 = 45933945;
    printf("First, assume int32_t is int:");
    printf("me32 = %d\n", me32);
    printf("Next, let's not make any assumptions.\n");
    printf("Instead, use a \"macro\" from inttypes.h: ");
    printf("me32 = %" PRId32 "\n" ,me32);

    return 0;
}

下面是该程序的输出:

First, assume int32_t is int:me32 = 45933945
Next, let's not make any assumptions.
Instead, use a "macro" from inttypes.h: me32 = 45933945

该程序最后一个printf()中,参数PRId32|被定义在inttypes.h中的”d”替换,因而这条语句等价于:

printf("me16 = %d" "d" "\n", me16);

在C语言中,可以把多个连续的字符串组合成一个字符串,所以这条语句就等价于:

printf("me16 = %d\n", me16);

最后值得强调的是C语言发展至今,一些编译器仍未实现inttypes.h头文件及其相关功能。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值