【问题标题】:What does the following mean in context of C programming language?以下在 C 编程语言的上下文中是什么意思?
【发布时间】:2022-01-08 08:02:51
【问题描述】:

来自 Jens Gustedt 的 Modern C,

计算机上的值表示可能在“文化上”因架构而异,或者由程序员赋予该值的类型决定。因此,如果我们想编写可移植的代码,我们应该尝试主要推理值而不是表示。

如果您已经有一些 C 语言和操作字节和位的经验,那么您将需要努力主动“忘记”您在本节的大部分内容中的知识。考虑计算机上值的具体表示会更加抑制你 比它有帮助。

要点 - C 程序主要推理值而不是它们的表示。

问题 1:作者在谈论什么样的价值观“表现形式”?我能否举一个例子,这个“表示”因架构而异,还有一个例子说明值的表示是如何由程序员赋予值的类型确定的?

问题 2:在 C 语言中指定数据类型的目的是什么,我的意思是这是语言的规则,但我听说编译器就是这样知道要为对象分配多少内存?这是唯一的用途,尽管很重要?我听说在 Python 中不需要指定数据类型。

【问题讨论】:

  • 我不确定作者想要表达什么观点,但是:如果您正在考虑“表示”,您可以使用 x >>= 1 来“有效地”将 x 除以 2。但如果你在考虑“价值”,你会写x /= 2。另一个例子:如果你写 int i; int *ip = &i; 并且你正在考虑表示,你认为“ip 在我的计算机地址空间中包含 i 的 32 位或 64 位地址。”但如果你考虑价值,你会认为“ip 是指向int 的指针,目前它指向i。”
  • 我,我发现这两种思维方式都很重要——尽管如果你使用不当,它们中的任何一种都会给你带来麻烦。
  • 另一个例子:如果你声明一个struct,并且你正在考虑表示,你把它的成员的大小加起来,你发现它和sizeof给你的不一样,然后您在 Stack Overflow 上询问它,有人将您的问题作为Why isn't sizeof for a struct equal to the sum of sizeof of each member? 的副本关闭。但是如果你在考虑值,你会认为sizeof(struct) 是理所当然的,因为你不在乎结构有多少字节,那是编译器的问题。

标签: c types


【解决方案1】:

作者在谈论什么样的价值观“表示”?

https://en.wikipedia.org/wiki/Two%27s_complement vs https://en.wikipedia.org/wiki/Ones%27_complement vs https://en.wikipedia.org/wiki/Offset_binary。一般https://en.wikipedia.org/wiki/Signed_number_representations.

还有大量的浮点数格式https://en.wikipedia.org/wiki/Floating-point_arithmetic#IEEE_754:_floating_point_in_modern_computers - IEEE 745、minifloat、bfloat16等。

能否举个例子,这个“表示”因架构而异

您的 PC 使用二进制补码 vs https://superuser.com/questions/1137182/is-there-any-existing-cpu-implementation-which-uses-ones-complement

啊——当然,最值得注意的是https://en.wikipedia.org/wiki/Endianness

还有一个例子,说明值的表示是如何由程序员赋予值的类型决定的?

(float)1 在 IEEE 745 中表示为 0b00111111100000000000000000000000 https://www.h-schmidt.net/FloatConverter/IEEE754.html

(unsigned)1 与 32 位 int 表示为 0b00.....0001

在C语言中指定数据类型的目的是什么,

有效地使用计算机资源。保留 2 GB 来存储 8 位数据是没有意义的。类型决定了变量中可以“包含”的值的范围。您将允许值的“上限/下限”传达给编译器,编译器会生成漂亮且快速的代码。 (还有ADA,您可以在其中指定类型的范围,例如type Day_type is range 1 .. 31;)。

程序是使用https://en.wikipedia.org/wiki/Harvard_architecture 编写的。块范围内的变量放在堆栈 https://en.wikipedia.org/wiki/Stack_(abstract_data_type)#Hardware_stack 上。这个想法是您必须提前知道要从堆栈中保留多少字节。类型就是这样交流的。

听说过编译器就是这样知道分配给对象的内存量吗?

Type 向编译器传达要为对象分配多少内存,但它也传达值的范围,表示形式(float_Float32 可能相似,但有所不同)。两个int 的溢出加法无效,两个unsigned 的溢出加法很好并环绕。有区别。

这是唯一的用途,尽管很重要?

类型最重要的用途是清楚地将代码的用途传达给其他开发人员

char character;
int numerical_variable;
uint_least8_t variable_with_8_bits_that_is_optimized_for_size;
uint_fast8_t variable_with_8_bits_that_is_optimized_for_speed;
wchar_t wide_character;
FILE *this_is_a_file;

我听说在 Python 中不需要指定数据类型。

这实际上是静态类型编程语言和动态类型编程语言之间的区别。 https://en.wikipedia.org/wiki/Type_system#Type_checking

【讨论】:

猜你喜欢
  • 2022-01-05
  • 2012-07-21
  • 2011-08-15
  • 1970-01-01
  • 2016-02-20
  • 2013-04-07
  • 2011-04-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多