c - 长长在 c99

标签 c assembly types abi long-long

在 C99 标准中,他们引入了 long long .这样做的目的是什么?在我(有限的)C 编程经验中,我只见过 4 字节的 int 和 8 字节的 long。例如,从编译器资源管理器:
enter image description here
long已经是 8那么,为什么还要再加一个long long类型?这对编译器/架构有什么影响?

最佳答案

If long is already 8 then, why is it necessary to add another long long type? What does this do to the compiler/architecture?


“如果 long 已经是 8”并不总是正确的,因为存在依赖 32 位的代码 longint作为 32 或 16 位。
需要 long因为 64 位会破坏代码库。这是一个主要问题。

还需要long保持 32 位(并且没有 long long)将无法访问标准的 64 位整数,因此是 long long 的基本原理.
允许 long因为 32 位或 64 位(或其他)允许转换。
各种函数传入/返回long喜欢 fseek(), ftell() .他们受益于 long超过 32 位以支持大文件。
推荐做法鼓励更广泛的 long : "用于 size_tptrdiff_t 的类型的整数转换等级不应大于signed long int除非实现支持足够大的对象以使其成为必要。”这与超过 32 位的内存大小有关。

也许在 future 的实现可能会使用 int/long/long long/intmax_t作为 32/64/128/256 位。
IAC,我看到固定宽度类型 intN_t越来越受欢迎 longlong long .我倾向于使用固定宽度类型或 bool , ( unsigned ) char , int/unsigned , size_t , ( u ) intmax_t然后离开 signed char , ( unsigned ) short , ( unsigned ) long , ( unsigned ) long long对于特殊情况。

关于c - 长长在 c99,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65648198/

相关文章:

c - 使用 C 和 GSList 迭代文件夹读取

c - 整数常量的默认类型是有符号的还是无符号的?

c - 简单的C程序,但无法给出预期结果

macos - Mac 上的汇编编程

list - 我可以在haskell 中列出类型吗?

c - 为什么寄存器数组索引未定义?

assembly - 如何在 IA32 汇编语言中获取位?

assembly - 什么时候应该在 x86 程序集中使用 MOVS 而不是 MOV?

python - cython编译错误 'is not a type identifier'

arrays - 如何在 TypeScript 中定义具有交替类型的数组?