【发布时间】: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)是理所当然的,因为你不在乎结构有多少字节,那是编译器的问题。