在printf函数中%zd和%zu以及相关占位符辨析

疑问:今天在写代码时,偶然发现在使用%zd时有些奇怪的现象,请看下列代码

size_t a = 5;

size_t b = 6;

size_t c = a - b;

printf("%zd",c);

该代码运行结果为-1。

然而我们都知道size_t类型相当于六十四位无符号整型,又怎么会出现符号呢?

在我对%zd的用法进行查找后。我发现如下结果

%zd 用来格式化 ssize_t 类型(有符号整数类型)或 size_t 类型(无符号整数类型)的值。这个占位符是用于确保正确的格式化,并且可以在有符号和无符号整数之间正确切换。

当你使用 %zd 时,它可以用于 ssize_tsize_t 类型,因此适用于带符号和无符号整数。、

大家可能对ssize_t类型有些陌生。这并不是c语言标准库中的类型。

ssize_t 通常用于 POSIX 操作系统中,表示有符号的大小或偏移量

那么什么是posix操作系统呢?

POSIX(Portable Operating System Interface for Unix)是一组操作系统接口标准,旨在提高不同Unix-like操作系统之间的兼容性。这些标准定义了API(应用程序接口)、命令行工具、系统调用等,使得应用程序在遵循POSIX标准的操作系统上能够跨平台运行。

POSIX标准最初是为了确保Unix系统之间的互操作性而创建的,但后来它也影响了其他Unix-like系统,例如Linux和BSD。POSIX标准覆盖了许多方面,包括文件I/O、进程控制、线程、网络编程、命令行工具等。

一些POSIX标准的重要组成部分包括:

  1. POSIX.1:定义了基本的系统调用和命令行工具,包括文件操作、进程控制等。
  2. POSIX.1b:实时扩展,添加了对实时操作系统功能的支持。
  3. POSIX.1c:定义了线程支持。
  4. POSIX.1d:定义了卫星通信领域的一些扩展。
  5. POSIX.2:定义了shell和命令行工具的标准,包括sh shell。
  6. POSIX.4:定义了网络编程相关的标准,包括套接字编程。
  7. POSIX.6:定义了国际化和本地化标准。

POSIX标准的目的是使开发者能够编写可移植的应用程序,这些应用程序可以在不同的POSIX兼容操作系统上运行而无需大规模修改。不同的Unix-like系统和一些非Unix系统(如Linux、macOS和FreeBSD)都支持POSIX标准,因此开发者可以编写遵循这些标准的应用程序,以实现跨平台的可移植性。

那么%d和%zd的区别到底在哪里呢?

区别在于 %d 适用于有符号整数,而 %zd 适用于既有符号整数又有无符号整数,可以避免数据类型不匹配的问题。如果你要输出 size_t 类型的值,最好使用 %zd 以确保正确的格式化。

简而言之,如果你要输出无符号整数类型(如 size_t),请使用 %zd 以避免潜在的问题。如果你要输出有符号整数,那么可以使用 %d

那么我们继续来讨论%zu的作用

%zu是用来格式化size_t类型的整数值的标准占位符。(这并不难理解 因此我们简略介绍)

接下来我们顺带总结一下

%d是仅用来打印有符号整型

%zd则既能打印无符号整型又能打印有符号整型

而%zu是size_t的标准占位符.

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值