以下摘自延斯·古斯泰特(Jens Gustedt)'Modern C'的摘录是什么意思?

  • 本文关键字:Modern 是什么 Jens Gustedt c types
  • 更新时间 :
  • 英文 :


这是我的第一本C编程书,在此之前,我参加了一些关于该语言的在线课程。这是一个顺利的阅读,直到以下出现

二进制表示和抽象状态机。

不幸的是,计算机平台的多样性并不能使C标准完全将运算结果强加给给定的类型。未完全规定的事项例如,标准包括有符号类型的符号如何表示(符号表示),以及执行双浮点运算的精度(浮点表示)。C只对表示施加性质,使得运算结果可以从两个不同的来源先验地推导出来:

  • 操作数的值
  • 描述特定平台的一些特征值

例如,在检查size_MAX的值以及操作数时,可以完全确定对类型size_t的操作。我们将模型称为表示给定平台上给定类型的值——该类型的二进制表示。

Takeaway-一个类型的二进制表示决定了所有操作的结果。

通常,我们需要确定模型的所有信息都在任何C程序的范围内:C库头通过命名值(如SIZE_MAX)、运算符和函数调用提供必要的信息。

Takeaway-一个类型的二进制表示是可观察的">

(第5章,第52-53页)

有人能为我解释一下吗?

抽象状态机

抽象机是正式C标准用来描述C程序应该如何运行的核心,特别是在代码生成、执行顺序和优化方面。这是一个有点高级的话题,所以如果你是初学者,我建议你暂时忽略它。除此之外,我在这里写了一个简短的解释。

标准中没有完全指定的内容是,例如,有符号类型的符号如何表示为(符号表示),以及执行双浮点运算的精度(浮点表示)。

这是指根据系统的不同,具有不同大小、不同有符号格式、不同端序等的整数和浮点。这意味着这些类型通常是不可移植的。

C只对表示施加属性,这样运算的结果就可以从两个不同的来源先验地推导出来:

  • 操作数的值
  • 描述特定平台的一些特征值

这是非常宽泛的,意义不大,基本上只是在某些情况下,使用运算符的结果是由语言定义的,而在一些情况下则不是。

例如,除了检查操作数之外,还可以在检查size_MAX的值时完全确定对类型size_t的操作。我们将模型称为表示给定平台上给定类型的值——该类型的二进制表示。

通常,我们需要确定该模型的所有信息都在任何C程序的范围内:C库头通过命名值(如SIZE_MAX)、运算符和函数调用提供必要的信息。

这可能意味着,例如,我们可以检查应用于size_t的操作数的运算符是否会给出预期结果:

size_t a, b = ...; // 
if(SIZE_MAX - a >= b)
{
size_t c = a + b; // addition will not be larger than SIZE_MAX
}
else
{
// a + b will not fit, handle error
}

但是,无符号数字有一个定义良好的环绕(与有符号数字不同),因此我们可以编写诸如if(a+b < a)之类的代码来检查操作是否导致了环绕。此行为对于无符号数字是定义良好且可移植的,但对于可能溢出的有符号数字,则是未定义的行为。

理论上,C中的任何整数类型(不是字符类型)都可以包含外来的东西,比如填充位。这主要是因为C支持奇异的有符号格式,如补码和有符号幅度,但也因为整数类型不一定要使用所有分配的位。不过,这都是高度理论化的律师语言,初学者并不关心。在现实世界中,整数几乎肯定没有填充位,有符号整数几乎肯定是2的补码。

另一个相关的高级主题:C具有逐字节查看任何变量的原始二进制表示的机制。我们可以通过将变量的地址强制转换为字符指针来实现这一点,然后取消引用该指针以获得原始二进制表示。这在高级语言中并不总是可能的——C语言比大多数语言更接近硬件。

相关内容

最新更新