c - 计算机如何区分空终止符的位和整数 0?

标签 c binary

我试图理解 '\0' 的二进制表示与 C 中 int 0 的二进制表示

如果'\0'是一个字符。二进制中 1 个字节的零为:00000000 ?

如果 0 是一个整数。二进制中的 4 个字节的零为:00000000 00000000 00000000 00000000?

1.我的上述理解正确吗?

2.如果是这样,int 的第一个字节如何不与空终止符混淆?

注意: 我知道 NULL 是 C 中的指针。我在这里指的不是指针。

最佳答案

  1. is my above understanding [of the representation of various int and char values] correct?

差不多了。在 C 源代码中表示为 (char)'\0'char 值在内存中具有数值零和全零表示形式。在所有现代机器上,该表示形式的大小都是 8 位,但 C 并不强制要求该特定大小,并且某些历史机器确实使用了不同的大小。

另请注意,正如 @mch 所观察到的,在没有任何强制转换的情况下,表达式 '\0' 的类型为 int。它可以转换为 char 类型,无需显式强制转换,例如,当您将其分配给该类型的变量时,确实会发生这种情况。

  1. if so, how is the first byte of an int not confused with a null terminator?

如果您的程序能够将 int 的第一个字节解释为 char 的表示,那么它的行为是未定义的。否则,它知道第一个字节是 int 的一部分,因为这是它分配给该位置的字节。 char(char)'\0' 的表示与作为另一种类型的对象的表示。

关于c - 计算机如何区分空终止符的位和整数 0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34161036/

相关文章:

c - 如何在C中定义结构体数组?

c - 将指向 C 结构的指针存储为整数

haskell - 如何在haskell中以二进制或十六进制打印整数文字?

C++ 无效的操作数和类型

python加法2位数字

C++: FStream 认为它已经到达二进制文件的 EOF

c++ - C 中的函数序言和结尾

c - 队列实现

c - 输出文件中不需要的空格

go - 为什么我说 8 时 Golang 不给我 8 个字节?