【发布时间】:2015-08-21 01:08:46
【问题描述】:
我看到几篇关于 size_t 与 uintptr_t/ptrdiff_t 的帖子(例如 size_t vs. uintptr_t),但没有关于这些新的 c99 ptr 大小类型的相对大小。
示例机器:vanilla ubuntu 14lts x64,gcc 4.8:
printf("%zu, %zu, %zu\n", sizeof(uintptr_t), sizeof(intptr_t), sizeof(ptrdiff_t));
打印:“8, 8, 8”
这对我来说没有意义,因为我认为必须签名的 diff 类型需要比无符号 ptr 本身更多的位。
考虑:
NULL - (2^64-1) /*largest ptr, 64bits of 1's.*/
2 的补码负数不适合 64 位;因此我希望 ptrdiff_t 大于 ptr_t。
[一个相关的问题是为什么 intptr_t 与 uintptr_t 大小相同......虽然我很舒服这可能只是为了允许有符号类型包含表示的位(例如,在负 ptr 上使用有符号算术会( a) 未定义,并且 (b) 具有有限的效用,因为 ptrs 被定义为“正”)]
谢谢!
【问题讨论】:
-
您在 intptr_t 和 uintptr_t 之间的唯一保证是它不会更小。事实上,真正发生的一切是你在说(使用 uintptr_t)“将没有签名表示”,无论实现中发生了什么(很可能是 2 的补码,因为很多非常好的理由)跨度>
-
不要在整数表达式中使用
NULL!如果你是整数0,写出来吧!NULLcan be(void *)0`,使表达式结果未定义(空指针上的算术未定义。 -
加/减 2 个整数或无符号整数的相同原因导致相同类型,即使您需要多 1 位以避免溢出正确表示结果。拥有比无符号版本长 1 位的类型是不切实际的,如果我们可以拥有这种类型,为什么不在需要时将新的有符号类型用作无符号类型呢?然后我们需要一个更长的有符号类型 1 并且递归问题无法解决
标签: c++ c pointers c99 computer-architecture