首先,您应该检查这两种类型的实际大小。以下代码片段类似于此:
#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;
}
我在两种情况下都得到了"8字节",这与long int和long long int相同,是最大的本机整数值。
当大小相同时(它们应该始终如此),size_t的"绝对值可以比ssize_t大2倍",而后者可以具有带符号(即正或负)值。
如果它们不同,则较大的一个将更大,并且因此可以容纳更大的值。
但最终,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
(如
-1
)的值,反之亦然。并且库函数使用其中一种类型。
然后,对于您的问题,您看到的两个数字相差5个单位,这正是您所期望的。您看到的是将这两个变量视为
unsigned long
时的值。尝试将它们作为
signed long
(
%ld
)打印,以便仍然可以看到符号。
ssize_t
不是标准 C 的一部分,它来自 POSIX。在标准 C 中最接近ssize_t
的类型是ptrdiff_t
。 - Jens Gustedtsize_t
是一种无符号整数类型,但通常不是unsigned int
。通常等同于unsigned long
或unsigned long long
。 - Adrian McCarthy