【问题标题】:size_t, intptr_t, and uintptr_t for math in csize_t、intptr_t 和 uintptr_t 用于 c 中的数学运算
【发布时间】:2015-10-10 13:53:22
【问题描述】:

我在某些代码中使用 size_t 值时遇到了一个小问题。

首先我想使用 size_t 因为它[保证]在大多数平台上都是相同的大小,这样从 32 位到 64 位应该不会导致任何问题。

然后我否定了 size_t 的值并得到了一个非常大的数字,回过头来我意识到 size_t 是无符号的。有 intptr_t 也是有符号的,但应该用于指针,还有 uintptr_t 是无符号的,也用于指针。

我的最终目标是在 c 中实现一组简单的定点数学函数。

我的问题是我可以在我的所有计算中像 int 一样使用 uintptr_t 吗?这会导致任何问题吗?

【问题讨论】:

  • 你试过off_t吗?
  • size_t 在 linux/gcc/32bit == 32bit,在 linux/gcc/64bit == 64bit
  • 你的库的用例是什么?对于值的范围,您想提供什么保证?
  • 用例是单位四元数和vector3和四元数到4x4矩阵。这部分代码仅此而已。由于四元数和弧度的小数部分更重,我希望小数部分有更多位。弧度的度数也可以适应高达 2pi 或其模数的大小。
  • 唯一负值ssize_t保证能够存储的是-1

标签: c math size-t


【解决方案1】:

如果您想在所有平台上拥有完全相同的位数,只需使用 stdint.h 中定义的 int32_t 即可

【讨论】:

    【解决方案2】:

    您可以考虑ptrdiff_t,这是指针差异产生的类型。在所有常见平台上,这应该是对应于size_t 的签名类型。

    【讨论】:

    • 在做了更多研究之后,似乎 ptrdiff_t 已签名并且应该能够完成我所需要的。让我们希望这个选择不会变成错误。
    • 这在 32 位系统和 64 位系统上的大小肯定是不同的。在 Linux 上:cat ptrdiff_t.c; cc ptrdiff_t.c -o ptrdiff_t; ./ptrdiff_t; cc -m32 ptrdiff_t.c -o ptrdiff_t; ./ptrdiff_t: #include <stdio.h> #include <stddef.h> int main() { printf("%zu\n", sizeof(ptrdiff_t)); return 0; } 8 4
    猜你喜欢
    • 2014-06-02
    • 2017-04-17
    • 2011-08-13
    • 2016-07-24
    • 2019-04-22
    • 2012-12-13
    • 2021-12-29
    • 1970-01-01
    • 2011-05-28
    相关资源
    最近更新 更多