是否可以在 c 中创建自定义大小的变量类型?

Fay*_*ure 5 c types

晚上好,如果我的英语不好,请提前抱歉,我是法国人。

因此,在 C 中,有不同的变量类型,例如 int、long、...根据类型需要多个字节,如果我没记错的话,“最大”类型是 long long int(或只是long long) 需要 8 个字节的内存(比如 long 很奇怪,所以如果有人能解释我也谢谢)

所以我的第一个问题是:我可以创建我的自定义变量类型,例如需要 16 个字节,或者如果数字对于 long long(或 unsigned long long)来说太高,我是否被迫使用字符串?

Ben*_*tto 9

您可以创建各种自定义类型,如果您想要一个 16 字节宽的“整数”类型,您可以创建一个自定义结构并将两个long longs配对在一起。但是,您必须手动实现对这些类型的所有算术。这在过去很常见,当时 16 位(甚至 32 位)机器最常见,您可以使用“bigint”库来执行 64 位整数数学运算。现在大多数机器要么是 64 位的,要么long long在 32 位目标上有本机支持,所以这不太有用。

你曾经经常看到这样的库:

typedef struct _BigInt {
    unsigned long long high;
    unsigned long long low;
} BigInt;

// Arithmetic functions:

BigInt BigIntAdd(BigInt a, BigInt b);

// etc.
Run Code Online (Sandbox Code Playgroud)

由于当前典型的 CPU 寄存器宽度为 64 位,因此这些值已经逐渐消失,这允许范围很大的值,除非您使用非常专业的数据,否则在正常编程任务中需要外部值不再“常见”那个范围。由于@datenwolf 在下面的评论中明确且正确,如果您发现生产代码中需要此类功能,请为其寻找可靠且经过调试的库。(编写自己的代码可能是一项有趣的练习,但如果您尝试将其作为快速完成其他工作的快速步骤,这种事情可能会成为一个错误农场。)正如 Eric P 在上面的评论中指出的那样,clang 提供了一种无需第三方库即可执行此操作的本机方式

(约的宽度怪异的歧义或换算公式long,并long long大多是历史的,如果你没有与它的混淆和不必要的实物平台演变。查看关于this--问题的意见C标准定义的最小尺寸整数类型,但并不是说它们必须彼此不同;从历史上看,类型char, short, int, longandlong long通常是区分 8、16、32 和 64 位大小的有用方法,但现在有点混乱,如果您想要特定大小的现代平台提供uint32_t保证大小而不是使用“经典”C 类型。)

  • 就 bignum 或任意精度数字而言:对于任何实际情况,我建议只获取一个经过良好测试的库,它提供所有算术基元和字符串格式以及读取,然后就到此为止了。– 自己做这件事是一个很好的学习练习,但如果你需要它在你的项目中可靠地工作,我强烈建议你不要这样做。 (3认同)