gpt4 book ai didi

c - 将 size_t 转换为 unsigned long int 是否安全?

转载 作者:太空狗 更新时间:2023-10-29 16:40:35 25 4
gpt4 key购买 nike

我需要一种可移植的方式来打印 size_t 类型的变量 n 的值。因为我使用 ANSI C89,所以我不能使用 z 长度修饰符。我目前的做法是将值转换为 long unsigned int:

printf("%lu\n", (long unsigned int) n);

假设 size_t 被定义为 unsigned intlong unsigned int 我看不出这会如何失败。 Actor 安全吗?

最佳答案

C89中,size_t被定义为无符号整数类型。与 future 的标准不同,C89定义了无符号整数类型列表如下:

  • 无符号字符
  • 无符号短
  • 无符号整数
  • 无符号长

因此,C89 中的 size_t 永远不会大于 unsigned long,因此转换始终是安全的 - 因为它不会导致任何未定义的行为,并且因为它总是足够大以容纳完整的值(value)。

值得注意; C89 标准规定:“符合标准的实现可以有扩展(包括额外的库函数),前提是它们不会改变任何严格符合标准的程序的行为”这意味着没有扩展可以更改此行为 - 同时仍符合 C89 标准,因为无符号整数类型已明确列出,因此无法更改。

在未来的标准中,这不是保证,虽然你不会得到未定义的行为 - 你可能会丢失 unsigned long 小于 size_t 的数据,这意味着你会向您的用户显示不正确的数据。在这种情况下,我会犹豫是否将其标记为“安全”。


作为重要的附加说明;此答案指的是符合 C89 标准的编译器。您的 C89 编译器可能在上述方面“不合规”,在这种情况下 - 将行为视为类似于 C99 或更新版本的行为,您不会看到未定义的行为,但如果 size_t 大于 unsigned long。不过需要明确的是,这不符合 C89 标准。

除此之外,虽然我对标准(1.7 合规性)的解释是,虽然它声明扩展不得改变“严格符合程序” 的行为,因此不能改变以下事实:size_t 必须最大为 unsigned long 而不遵守;它不会改变此类扩展确实存在的事实。例如,GNU GCC 确实提供了一个添加 unsigned long long 的扩展。在我看来,这是不合规的,但现实是你必须准备好处理这样的事情 - 虽然标准说你正在做的是完全安全的,但你必须为潜在的数据丢失做好准备使用了不兼容的编译器或扩展


有关此主题的先前讨论,请参阅此处: https://stackoverflow.com/a/39441237/955340

关于c - 将 size_t 转换为 unsigned long int 是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47556181/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com