【发布时间】:2011-01-03 07:13:38
【问题描述】:
我是一名阅读 K&R 的初级程序员,我觉得这本书假设了很多以前的知识。让我感到困惑的一个方面是内存中变量的实际表示,或者我应该说存在。数据类型究竟为变量指定了什么?我不太清楚如何表达这个问题......但我会问几个问题,也许有人可以为我想出一个连贯的答案。
当使用 getchar() 时,有人告诉我使用“int”类型比使用“char”类型更好,因为“int”可以保存更多值,而“char”只能保存 256 个值。由于我们可能需要变量来保存 EOF 值,因此我们需要超过 256 个,否则 EOF 值将与 256 个字符之一重叠。在我看来,我认为这是一堆空洞的盒子。有人可以给我一个更好的代表吗?这些“盒子”有索引号吗?当 EOF 与 256 个可用值中的一个值重叠时,我们能否预测它将与哪个值重叠?
另外,这是否意味着数据类型“char”只有在我们只是手动为变量赋值时才可以使用,例如 char c = 'a',当我们明确知道我们只会有256 个可能的 ASCII 字符?
另外,“char”和“int”之间真正重要的区别是什么?如果我们可以使用“int”类型而不是“char”类型,为什么我们决定在某些时候使用一种而不是另一种呢?是为了节省“内存”(我使用引号,因为我实际上并不知道“内存”究竟是如何工作的)。
最后,char 类型的 256 个可用值究竟是如何获得的?我读了一些关于模 2^n 的东西,其中 n = 8,但为什么它会起作用(与二进制有关?)。 “模2 ^ n”的模部分是什么意思(如果它与模运算有任何关系,我看不到关系......)?
【问题讨论】:
-
"当我们确定我们只有 256 个可能的 ASCII 字符时?" nit-pick:ASCII 中只有 128 个字符。
-
不仅仅是“int”.. 还有 unsigned int (0-65535) 和 signed int (-32767 到 32767)... 在大多数实现中,普通字符在 unsigned 中是 0 到 255 .你也有短期和长期。 short 是 2 个字节,int 是 4 个字节,long 是 8 个字节。见这里:home.att.net/~jackklein/c/inttypes.html
-
对不起 :s 那么我可以问为什么我们不能使用“char”类型的 256 个可用值,如果我们还使用函数 getchar() 并期望在某个时候出现 EOF?
-
你的时间很有趣。我的意思是没有讽刺,只是鼓励。在这条路上,有很多非常有趣的东西摆在你面前。正如 Rob 在下面提到的,拿到 Petzold 的书并通读一遍。享受学习!
-
下面的许多答案都假设数字的补码表示。 C 不做这样的保证。它可以在补码机器和符号幅度机器(或任何其他奇怪的编码!)上运行(并且确实运行)。
标签: c types kernighan-and-ritchie kr-c