聊聊char
什么是char?
初学c语言的同学可能以为 char
表示的就是字母意义的字符, 那我们来看下 C Primer Plus和 Wikipedia上对它的定义
The
char
type is used for storing characters such as letters and punctuation marks, but technically it is an integer type. Why? Because thechar
type actually stores integers, not characters.
Smallest addressable unit of the machine that can contain basic character set. It is an integer type. Actual type can be either signed or unsigned depending on the implementation. It contains CHAR_BIT bits.[3]
由此可见, char
本质上存储的是整数, 且(sizeof(char) == 1)
, 即可以存储256个不同整数的8位1数据类型. 我们也可以把它理解为 short short
2, 与64位的long long
要相乎应. 那char
为什么而设计的呢? 是为了存储 ASCII码
. 我们知道, 标准ASCII码是从0到127. 所以只需要7位的有符号整数就够了, 用char来表示绰绰有余, 不过这里有一点要注意, 就是虽然 char
是8位整数, 但是它的默认类型并没有在标准中定义, 也就是说在不同的平台上面它的默认值是可能是signed
或unsigned
(虽然两者都足够表示 ASCII 了). 据我所知, x86平台上的char
3, 虽然这会稍微加快运行速度, 但是也会引起些潜在的 bug, 比如万一用户所在平台默认是unsigned
, 而又使用了 char和 getchar()
来接受字符, 在判断 EOF
时由于 char 是unsigned
的, 所以就会永远不停止, 而改成int
类型就能避免这一威胁. 当然, char 也可以显式声明为unsigned
和signed
, 这一的话8-bit signed char
的范围是 [-128, 127]
, 8-bit unsigned char
的范围是[0, 255]
.
从字符到字符串
既然 c 里面的字符说到底都是整数, 那么字符串该怎么界定呢? 本文不详谈(毕竟标题是char, 不是 _char*
或 char[]
, 日后有机会再写), 简单的说, c 的字符串就是一系列字符(由整数表示)构成的, 不过要记住, 最后是以第一个4'\0'
5来结尾的, 这被称作 c 风格字符串, 它是作为串出现的, 已经重载了 operator <<
, 即使 std::string
里面的字符包含了'\0'
, string::operator <<
也会一视同仁,继续输出后面的字符.
参考文献:
- http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf
- https://en.wikipedia.org/wiki/C_data_types#cite_ref-c99generalrepr_5-1
- https://www.quora.com/What-is-char-in-C-for
- http://stackoverflow.com/questions/11294850/the-ascii-value-of-0-is-same-as-ascii-value-of-0
- c语言点滴
- https://segmentfault.com/q/1010000008344245