以下内容在编程环境中,特别是在C编程语言中是什么意思



计算机上的值表示可能因体系结构的不同而"文化"不同,或者由程序员赋予值的类型决定。因此,如果我们想编写可移植代码,我们应该尝试主要对值进行推理,而不是对表示进行推理。

指定值。我们已经看到了几种指定数字常量(文字)的方法:

123十进制整数常量
077八进制整数常量
0xFFFF十六进制整数常量

问题:十进制整数常量和十六进制整数常量是"表示"值的不同方式,还是它们本身的值?如果是后者,在不同的体系结构上用什么不同的方式来表示它们?

上述内容的来源是";现代C";由Jens Gustedt撰写,可在网上免费获得,特别是从第38页到第46页。

单词"表示";可以在两种不同的上下文中使用。

一种是当我们(程序员)指定例如整数常量时。例如,值37可以在C码中表示为370x25045。无论我们选择了哪种表示,C编译器在生成二进制代码时都会将其解释为相同的值。因此,这些语句都生成相同的代码:

int a = 37;
int a = 0x25;
int a = 045;

另一个上下文是编译器如何选择在内部存储值37。C标准规定了一些要求(例如,int的表示必须至少能够表示-32767+32767范围内的值)。在C标准的规则中,编译器将使用一个位表示,该位表示可以由目标系统的CPU的本地语言有效地操作。有符号整数最常见的表示形式是Two的补码,通常类型为int的有符号整数将占用2或4个字节,每个字节8位。

然而,C标准足够灵活,可以允许其他内部表示(例如,具有超过8位的字节或有符号整数的1补表示)。不同系统上多字节整数表示的一个常见区别是使用不同的字节顺序。

C标准主要关注标准操作的结果。例如,无论在哪个平台上执行表达式,5+6都必须给出相同的结果,但在给定的平台上如何表示5611在很大程度上取决于编译器。

对于每个C程序员来说,理解C是一个保护您免受底层硬件影响的抽象层是至关重要的。这项服务是该语言存在的原因。除其他外,该语言保护您免受用于在不同平台上保存相同值的不同内部字节模式的影响:您编写一个值并对其进行操作,编译器将确保生成正确的代码。这在汇编程序中是不同的,因为您密切关注内存布局、寄存器大小等。

万一它不明显:我之所以强调这一点,是因为当我学习C.时,我自己也很难理解这些概念

首先要强调的是C程序代码是文本我们在这里处理的是值的文本表示,一系列(很可能)ASCII代码,就像你给奶奶写信一样。

像0443(不太常见的八进制格式)、0x0123或291这样的整数文字只是同一值的不同字符串表示。在这里和标准中;值";是数学意义上的一个值。正如我们所想的";哦,C"当我们看到";0x0123";,这不过是一种写下291的数学值的方法。这意味着";值";,例如当标准规定";整数常量的类型是可以表示其值的相应列表中的第一个"编译器必须在程序的内存中创建该值的二进制表示。这意味着它必须找出它的值(在所有情况下都是291),然后为它生成正确的字节模式。无论你选择将其字符串表示形式写在10、16还是8,C代码中的整数文字都不是二进制形式。。特别地,0x0123并不意味着两个字节0123将在编译程序中的任何位置,或者按哪个顺序1

要演示抽象,请考虑表达式(0x0123 << 4) == 0x1230,它在所有机器上都应该为true。这里,两个十六进制文字的类型都是int。十六进制代码的美妙之处在于,它使4的倍数的位操作非常容易计算。

在典型的当代Intel体系结构上,CCD_;little endian first";,或";小endian";简而言之:如果我们按升序检查内存,则值最低的字节会排在第一位。0x123表示为00100011-00000001-00000000-000000(因为对于如此小的数字,两个最高值字节为零)。0x1230因此为00110000-00010010-00000000-00000000000硬件上没有发生任何左移(但也没有右移!)。位移位运算符的语义是一个抽象:想象一个规则的二进制数,遵循阿拉伯的老习惯,从最高值的数字开始,并将想象的二进制数移位";它是一个抽象,与硬件上发生的任何事情都没有相似之处,编译器只需将这个抽象操作转换为特定硬件的正确操作


1现在无可否认,它们可能存在,但在流行的x86平台上,它们的顺序将颠倒,如下所述

十进制整数常量和十六进制整数常量是表示值的不同方式,还是它们本身的值?

这就是哲学!它们是表示值的不同方式,例如:

0x2          means 2 (for a C compiler)
two          means 2 (english language)
a couple     means 2 (for an english speaker)
zwei         means 2 (...)

C编译器从";某种形式的人类可理解的语言";至";机器可以理解的非常精确的形式":从各种形式中唯一保留下来的是亲密的意义(价值!)。

碰巧,为了更友好,C允许您以两种不同的方式指定整数,十进制和十六进制(好吧,甚至是八进制,最近还有二进制表示法)。C编译器感兴趣的是,并且,正如已经在注释中指出的,在C具有";理解";值之间没有更多的差异;0xC";或一个";12〃;。从那时起,编译器必须使用目标机器使用的表示使机器理解值12,同样重要的是值。

很可能,短语

我们应该尝试主要对值进行推理,而不是对表示进行推理

是邀请程序员选择正确的数据类型和值,但不仅:还为类型和变量等提供有用的名称。一个不太好的例子是:即使我们知道换行符(通常)由10位小数表示,我们也应该使用LF或"\n〃;或者类似的,这是我们想要的价值,而不是它的表现。

关于数据类型,尤其是整数,与其他允许您根据其可能值定义类型的语言相比,C并不是特别出色(例如,使用"-3.5"表示法,该表示法规定可能值从-3到5,并允许编译器选择-3到5范围内的表示所需的位数)。

最新更新