C size_t和ssize_t负值

pol*_*nux 11 c size-t

size_t被声明为unsigned int不能代表负值.
那么有ssize_t哪些是签名类型的size_t权利?
这是我的问题:

#include <stdio.h>
#include <sys/types.h>

int main(){
size_t a = -25;
ssize_t b = -30;
printf("%zu\n%zu\n", a, b);
return 0;
}
Run Code Online (Sandbox Code Playgroud)

为什么我得到:

18446744073709551591
18446744073709551586
Run Code Online (Sandbox Code Playgroud)

结果?
我知道size_t这可能是因为它是一个无符号类型,但为什么我得到了错误的结果ssize_t

cni*_*tar 20

在第一种情况下,您将分配给无符号类型 - a.在第二种情况下,您使用了错误的格式说明符.第二个说明符应该是%zd而不是%zu.

  • `ssize_t` 是否定义为与 `size_t` 相同的大小?如果不是,“%zd”就不是一个可移植的答案。建议 `printf("%jd\n", (intmax_t) b);` (2认同)
  • @chux我在printf上引用了一个linux手册页.[标准](http://pubs.opengroup.org/onlinepubs/9699919799/functions/fprintf.html)也提到它虽不如清楚. (2认同)
  • @cnicutar 再次感谢:浏览“linux man page on printf”并找到了它。注意:提供的链接(开放组基本规范)没有关于“ssize_t”的任何内容。 (2认同)
  • @cnicutar 有点晚了,但我没有将 * 与 size_t 参数相对应的有符号整数类型 * 读作明确引用 `ssize_t` 。`ssize_t` 的定义从未以任何方式将其链接到 `size_t`。[整个定义仅仅是](https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_types.h.html):“用于字节计数或错误指示。” 和“类型‘ssize_t’应能够存储至少在[-1, {SSIZE_MAX}]范围内的值。” [`SSIZE_MAX`的定义](https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/limits.h.html)是循环的。 (2认同)