当寻找unsigned long
证据足以容纳size_t
以便成为printf
参数时,我遇到了两个事实(oid)s。
首先,这个答案表明long
确实不足以保证size_t
足够大。 另一方面,我看到这个答案建议在前C99中使用printf("%lu", (unsigned long)x)
, x
是size_t
。
所以问题是你可以假设或者你保证在C99之前持有size_t
long
足够long
。 另一个问题是,是否有任何保证size_t
适合任何其他标准化整数类型(除了明显的例外,如ssize_t
, ptrdiff_t
等)。
没有这样的保证。
虽然实现对于long
和size_t
具有相同的大小是常见的,但情况并非总是如此。 正如评论中所提到的,Windows 64位对于long
和size_t
具有不同的大小。
另请注意,实现的SIZE_MAX
的最小值为65535
而ULONG_MAX
的最小值为4294967295
( LONG_MAX
为2147483647
)。 (注意, SIZE_MAX
出现在C99中。)这意味着size_t
保证至少为16位,但unsigned long
/ long
保证至少为32位。
编辑:问题在这个答案之后发生了一些变化……所以:
所以问题是你可以假设或者你保证在C99之前持有size_t的时间足够长。
即使在C89中也没有这样的保证。 long
可以是32位, size_t
64位。 (请参阅上面Windows 64位中带有MSVC的C89示例。)
另一个问题是,是否有任何保证size_t适合任何其他标准化整数类型(除了明显的例外,如ssize_t,ptrdiff_t等)。
标准也没有这样的保证。 size_t
是另一个标准无符号整数类型的别名(它不能是扩展整数类型,因为C89没有扩展整数类型)。
所以问题是你可以假设或者你保证在C99之前持有
size_t
long
足够long
。
long
,但unsigned long
。
在C89 / C90中, size_t
必须是无符号整数类型。 C89 / C90中正好有4个无符号整数类型 : unsigned char
, unsigned short
, unsigned int
和unsigned long
。 因此, 在C89 / C90中 , size_t
可以不宽于unsigned long
,因此任何类型size_t
值都可以转换为unsigned long
而不会丢失信息。 (这仅适用于unsigned long
,而不适用于long
。)
这种隐式保证在C99中消失了,引入了unsigned long long
和扩展整数类型 。 在C99及更高版本中, size_t
可以比unsigned long
更宽。 例如,C99实现可能具有32位long
和64位long long
,并且使size_t
成为unsigned long long
的别名。
即使在C89 / C90中,只有在符合C89 / C90标准的情况下才能依靠保证。 前C99编译器通常在C89 / C90标准之上提供扩展 – 例如编译器可能支持long long
,并且可能使size_t
成为unsigned long long
的别名,即使编译器不完全支持C99(或C11)标准。
问题是关于printf
。 请记住, printf
的参数必须是格式字符串的适当类型。 这个:
printf("sizeof (int) = %lun", sizeof (int));
具有未定义的行为,除非size_t
恰好是unsigned long
的别名(即使size_t
和unsigned long
碰巧具有相同的大小)。 您需要将值强制转换为正确的类型:
printf("sizeof (int) = %lun", (unsigned long)sizeof (int));
对于C99及更高版本,您可以直接打印size_t
值:
printf("sizeof (int) = %zun", sizeof (int));
如果愿意,您可以测试__STDC_VERSION__
的值以确定使用哪一个。
(关于C标准版本的说明。第一个C标准由ANSI于1989年出版。它于1990年由ISO重新发布,增加了额外的样板部分。因此C89和C90是描述相同语言的两个不同文档。后来的C99和C11标准由ISO发布。所有三种ISO C标准均由ANSI正式采用。严格来说,“ANSI C”应参考ISO C11 – 但由于历史原因,该短语仍用于指代1989年标准。)
以上就是c/c++开发分享`long`保证与`size_t`一样宽相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/544893.html