首先,您应该检查两种类型的实际尺寸。类似下面的代码片段应该做的事情:
#include <stdio.h>
#include <unistd.h>
int main() {
printf( "sizeof( size_t ) = %d bytes\n",(int) sizeof( size_t) );
printf( "sizeof( ssize_t ) = %d bytes\n",(int) sizeof( ssize_t) );
return 0;
}
在这两种情况下,我都得到 (64bit Linux, GCC v7.2) “8 bytes”,这与 long int 和 long long int 相同,即最大 CPU 原生整数值。
当大小相同(并且它们应该始终相同)时,size_t
可以具有“绝对值大 2 倍” ssize_t
,而后者又可以具有带符号的(正或负)值。
如果它们不同,那么较大的将是……更大,因此可以容纳更大的值。
但归根结底,ssize_t
是size_t
两种不同的类型,用于“谈论”大小、长度、内存量等。
前者只是为该值放弃 1 位,以获得发出某种错误信号所需的符号。
最后,这两种类型不可互换,至少并非总是如此。当大小可以超过 2^63 字节/项目时,差异就很明显了。
size_t
不会溢出而ssize_t
会。
在“正常”情况下,您可以从一个投射到另一个。对于我之前提到的情况,你不应该混合它们。
仅作为参考,两者都strlen()
使用malloc()
,size_t
而两者都read()
使用readv()
ssize_t。
因此,ssize_t
不是的签名版本,size_t
因为其中的某些值ssize_t
无法映射到size_t
(like -1
) 上,反之亦然。库函数要么使用一种类型,要么使用另一种。
然后,对于您的问题,您看到的两个数字相差 5 个单位,这正是您所期望的。你看到的是这两个变量的值unsigned long
。尝试将它们打印为signed long
( %ld
),这样您仍然可以看到标志。