c - 为什么我们使用显式数据类型? (从低层次的角度来看)

标签 c types x86 language-design low-level

当我们查看一些基本数据类型时,例如 char 和 int,我们知道 char 只是一个无符号字节(取决于语言),int 只是一个带符号的双字,bool 只是一个 char只能是 1 或 0 等。我的问题是,为什么我们在编译语言中使用这些类型,而不是仅仅声明一个字节、双字等类型的变量,因为应用于上述类型的操作几乎都是同样,一旦你区分有符号和无符号数据以及 float 据?

延伸题意,在C语言中,if和while语句可以将boolean值作为输入,通常以char形式存储,这就需要明确的boolean类型。

实际上,这两段代码在二进制级别应该是等价的:

int main()
{
    int x = 5;
    char y = 'c';
    printf("%d %c\n", x - 8, y + 1);
    return 0;
}

//outputs: -3 d

-

signed dword main()
{
    signed dword x = 5;
    byte y = 'c';
    printf("%d %c\n", x - 8, y + 1);
    return 0;
}

//outputs: -3 d

最佳答案

My question is, why do we use these types in compiled languages

使代码与目标无关。某些平台只有高效的 16 位整数,强制您的变量始终为 32 位会使您的代码在为此类平台编译时无缘无故地变慢。或者您可能有一个包含 36 位整数的目标,而严格的 32 位类型将需要额外的指令来实现。

您的问题听起来非常以 x86 为中心。 x86 不是唯一的体系结构,对于大多数语言而言,这不是语言设计者所考虑的一种。

即使是在 x86 时代设计的在台式机和服务器上广泛使用的最新语言也被设计为可移植到其他 ISA,例如 8 位 AVR,而 32 位 int 需要4 个寄存器对比 16 位 int 的 2 个。

关于c - 为什么我们使用显式数据类型? (从低层次的角度来看),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53805468/

相关文章:

c - C中双阶乘方程的尾递归

c - C 中的 wait()。我应该传递什么参数给它

c - 为什么要使用 void 指针来取消引用数据类型的变量?

scala - 为什么创建元组的显式语法只允许 AnyRefs 作为类型注释?

haskell - 类型类 - 简要说明

c - 无法在 Windows 操作系统上的 Eclipse 中交叉编译 C

assembly - x86 JAE指令与进位标志有何关系?

c - 开关盒 assembly 级代码

c - 有信号时要注意什么

c - C 中的函数语法