sky*_*ing 4 c c89 language-lawyer
当寻找unsigned long足以为size_t争论目的而持有的证据时,printf我遇到了两个事实(oid).
首先,这个答案说明long确实不能保证足够大size_t.另一方面,我看到这个答案暗示printf("%lu", (unsigned long)x)在C99之前使用,x是的size_t.
所以问题是你可以假设或者你保证在C99之前long就足够了.另一个问题是,是否存在适合任何其他标准化整数类型的保证(除了明显的例外情况,例如,等等).size_tsize_tssize_tptrdiff_t
没有这样的保证.
虽然是很常见的实施具有相同的大小long和size_t,它并非总是如此.正如评论中所提到的,Windows 64位具有不同的大小long和size_t.
另请注意,SIZE_MAX实现65535的最小值ULONG_MAX是最小值is 4294967295(2147483647for LONG_MAX).(请注意,SIZE_MAX与C99出现了.)这意味着size_t保证是至少16位,但unsigned long/ long保证是至少32位.
编辑:问题在这个答案后有所改变......所以:
所以问题是你可以假设或者你保证在C99之前持有size_t的长度足够长.
即使在C89中也没有这样的保证.long可以是32位和size_t64位.(请参阅上面Windows 64位中带有MSVC的C89示例.)
另一个问题是,是否有任何保证size_t适合任何其他标准化整数类型(除了明显的例外,如ssize_t,ptrdiff_t等).
标准也没有这样的保证.size_t是另一个标准无符号整数类型的别名(并且它不能是扩展整数类型,因为C89没有扩展整数类型).
| 归档时间: |
|
| 查看次数: |
703 次 |
| 最近记录: |