user-0 提问: 『大一』请教“字符本质是小整形”作何解释？

回复:
user: user-1
content: 单字节的char相当于一个字节，或者一个表示0~255或者-127~127的整数。（所谓的“小整型”） 双字节的char相当于两个字节，或者short/ushort（在x86系统上的编译器上） 理论上说，double使用4个字节表示，也可以算“整型”。但是我们一般不这么看，因为char和整型有类似的一面，它都表示一个序数。比如'A'，它相当于“第65号字符”。而double对于整数的映射关系复杂的多。

user: user-2
content: 这样理解可能比较容易些吧，计算机所有的东西都是用二进制表示的，因此一串01表示什么由如何解释它决定。如何解释它是由用户决定的。比如一个4字节当成浮点数，CPU将采用浮点数运算对它进行运算，使用%f输出时，将按照浮点数表示规则转换为十进制数打印出来。比如一个字节当成ASCII字符，当要显示这个字符时（%c指明了要以字符的形式处理），首先会找到这个字节表示的数值（0~255）对应的字符，然后在屏幕上显示出来（文字的编码也是采用的这种逻辑）。所以说字符的本质就是小整数，它是通过整数记录的。

user: user-0
content: 各位所说，给我很大启发！诸位所提的，绝大多数，是我在学校、在课本上闻所未闻的。我想，如果我弄懂了诸位所说，我的水平能有有所提升！再次感谢诸位的热心解惑！[

user: user-3
content: 其次，一个声明为char类型的对象，足以容纳任何基本执行字符集的成员，并且保证为非负值。 ------------------------------------------>其次，一个声明为char类型的对象，足以容纳任何基本执行字符集的成员，当它保存的是基本执行字符集的成员时，保证为非负值。

user: user-3
content: 来C版块这么久，也就这个帖子还有点价值。 首先，尽管历史上我们经常用char类型的对象来保存单个字符，但char类型是整数类型的一种。事实上，char、带符号整数类型、无符号整数类型和枚举类型，合称整数类型。将char类型看成是小整型，可能是作者自己的说法，在标准中没有这一个术语，他的意思是char类型的长度，是所有整数类型中最小的。 其次，一个声明为char类型的对象，足以容纳任何基本执行字符集的成员，并且保证为非负值。但是，char类型的对象并非仅仅针对ASCII，因为C允许多种字符集。那种认为char类型的对象保存的是ASCII字符的说法，无论从哪方面来说都是荒谬的。 再次，char类型是单字节的，它可能等效于unsigned char，也可能等价于signed char，到底是哪种，由C的实现决定。但是，不管怎样，char、signed char和unsigned char是三种截然不同的类型，而且互不兼容。 最后，char类型的最大值和最小值是实现定义的。未必象楼上有些人所说，毕竟一个字节包含多少比特（经常是8个），随处理器架构的不同而异。在有些机器上，一个字节是9个比特。一个字节所包含的比特数，以及char类型的取值范围，是在头文件<limits.h>中定义的。

user: user-4
content: 这个说法也只能在某种条件下成立，“本质”这个词不能随便用，要说本质，无类型才是本质。

user: user-5
content: 初接触计算机语言，都会感觉是一堆英文符号英文代码，但随着你对计算机体系的学习理解，你在看代码眼前出现的、感知的就不单单是文字代码，而有相应的空间、时间概念。知道源代码如何一步一步转换成机器识别机器码，知道机器代码如何存储，又是如何一步一步运行的。

user: user-6
content: 我们老师没这么讲过。。

user: user-7
content: 引用 楼主 u012310873 的回复:课余看《C和指针》做些拓展的时候，读到这么一句话“字符本质是小整形。”有点困惑，去百度查了之后，更糊涂了！cha型r与ASII相关，占一个字节，而ASII转换为二进制数。int型占两个字节，直接转换成二进制数。char的二进制表现范围在int型的范围之内，所以”字符本质是小整形“。那么，照这么说，int型不也就是小double型了吗？ 上述所说，可能存在严重错误，还请为我指出解惑！感谢！  你以为计算机里面能存 a b c d ？ 只有0和1罢了

user: user-8
content: 先 http://www.microsoft.com/visualstudio/chs/downloads#d-2010-express 点开Visual C++ 2010 Express下面的语言选‘简体中文’，再点立即安装  再参考C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\cvt\*.*

user: user-9
content: 引用 13 楼 sholber 的回复:[quote=引用 12 楼 FrankHB1989 的回复:] 说到底“字符本质是小整形”这种如果要说合理性也就是char是integer type而已，其它可以无视。 int型占两个字节更是经典胡扯。 现行ISO C规定： 1.有符号整数用原码反码补码之一表示，除了char等少数约定的类型外可以有padding； 2.int至少能表示得下32767，至于具体多大，没说； 3.一个字节的位数CHAR_BIT >= 8。 而大多数你碰得到的现实实现是这样的：补码表示；CHAR_BIT == 8；无padding；32位环境下sizeof(int) == 4（64位下不少还是一样）。 所以扯int两个字节的乱七八糟的玩意儿没什么参考价值。切记要尝试预估想要查证的资料的可靠性和权威性，不要乱投医。 另外，基本执行字符集也不见得是ASCII。主要的反例是EBCDIC。上来动辄扯ASCII跟char值的东西大多也就只能一笑了之了。 说实话就是C本身还好，ISO C算是公认的没被实现架空的规范（M$奇葩不论），也就谭×之类能骗骗小白。其它一些地方不靠谱的说法太多太乱了，大部分用户也未必需要搞清楚——也未必有机会搞清楚。比如关于reentrancy跟thread safety的定义涵盖，POSIX跟Qt文档使用的定义下的结论刚好相反。这时候还得搞清楚语境判断上下文再作结论。 所以10L赵老湿之类怎么放置play的正确姿势应该不难理解了吧。 +1 这两段话说得我好舒坦。老幻近来可好？[/quote] 偶尔教育些Lisp水群里的易经厨，看看yinwang的不定期娱乐材料，倒也乐呵得马马虎虎。

user: user-3
content: 引用 12 楼 FrankHB1989 的回复:说到底“字符本质是小整形”这种如果要说合理性也就是char是integer type而已，其它可以无视。 int型占两个字节更是经典胡扯。 现行ISO C规定： 1.有符号整数用原码反码补码之一表示，除了char等少数约定的类型外可以有padding； 2.int至少能表示得下32767，至于具体多大，没说； 3.一个字节的位数CHAR_BIT >= 8。 而大多数你碰得到的现实实现是这样的：补码表示；CHAR_BIT == 8；无padding；32位环境下sizeof(int) == 4（64位下不少还是一样）。 所以扯int两个字节的乱七八糟的玩意儿没什么参考价值。切记要尝试预估想要查证的资料的可靠性和权威性，不要乱投医。 另外，基本执行字符集也不见得是ASCII。主要的反例是EBCDIC。上来动辄扯ASCII跟char值的东西大多也就只能一笑了之了。 说实话就是C本身还好，ISO C算是公认的没被实现架空的规范（M$奇葩不论），也就谭×之类能骗骗小白。其它一些地方不靠谱的说法太多太乱了，大部分用户也未必需要搞清楚——也未必有机会搞清楚。比如关于reentrancy跟thread safety的定义涵盖，POSIX跟Qt文档使用的定义下的结论刚好相反。这时候还得搞清楚语境判断上下文再作结论。 所以10L赵老湿之类怎么放置play的正确姿势应该不难理解了吧。 +1 这两段话说得我好舒坦。老幻近来可好？

user: user-9
content: 说到底“字符本质是小整形”这种如果要说合理性也就是char是integer type而已，其它可以无视。 int型占两个字节更是经典胡扯。 现行ISO C规定： 1.有符号整数用原码反码补码之一表示，除了char等少数约定的类型外可以有padding； 2.int至少能表示得下32767，至于具体多大，没说； 3.一个字节的位数CHAR_BIT >= 8。 而大多数你碰得到的现实实现是这样的：补码表示；CHAR_BIT == 8；无padding；32位环境下sizeof(int) == 4（64位下不少还是一样）。 所以扯int两个字节的乱七八糟的玩意儿没什么参考价值。切记要尝试预估想要查证的资料的可靠性和权威性，不要乱投医。 另外，基本执行字符集也不见得是ASCII。主要的反例是EBCDIC。上来动辄扯ASCII跟char值的东西大多也就只能一笑了之了。 说实话就是C本身还好，ISO C算是公认的没被实现架空的规范（M$奇葩不论），也就谭×之类能骗骗小白。其它一些地方不靠谱的说法太多太乱了，大部分用户也未必需要搞清楚——也未必有机会搞清楚。比如关于reentrancy跟thread safety的定义涵盖，POSIX跟Qt文档使用的定义下的结论刚好相反。这时候还得搞清楚语境判断上下文再作结论。 所以10L赵老湿之类怎么放置play的正确姿势应该不难理解了吧。

user: user-9
content: 主要原因归根结底大概是因为渣UNIX天生就混淆character跟byte的概念。 大约他们本来以为1个byte就能表示所有character了，所以把该叫byte的东西叫成了char。 经过各种胡乱设计和妥协，后来的结果就是C的char跟signed char和unsigned char是存储保证是1个byte的三种不同的整数类型。char专用于表示character，在算术操作中是不是有符号看实现高兴（或者你知道怎么艹编译选项）。 后来嘛，I18N需求出来了，如意算盘破产了，C94的multibyte character糊弄乱了，结果闹出个跟char类似废柴的wchar_t。只不过没signed wchar_t和unsigned char_t，不是内建类型罢了。再后来知道wchar_t的大小不确定不靠谱，于是不得不整出char16_t跟char32_t，姑且在假定CHAR_BIT==8以及实现不多留padding的基础上能做到ABI兼容了。 PS.C艹也逃不了，差别只是wchar_t、char16_t和char32_t是内建类型。结合权威定义，照样有“多字节字符”不是“字符”的搞笑逻辑。 PS2.Java的char在某种意义上更搞笑，因为有奇葩的UTF变种问题。不过编码之类的，LZ倒也未必需要急着了解了。

user: user-8
content: 对电脑而言没有乱码，只有二进制字节；对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A  电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

user: user-3
content: 引用 1 楼 caozhy 的回复:单字节的char相当于一个字节，或者一个表示0~255或者-127~127的整数。（所谓的“小整型”） 双字节的char相当于两个字节，或者short/ushort（在x86系统上的编译器上） 理论上说，double使用4个字节表示，也可以算“整型”。但是我们一般不这么看，因为char和整型有类似的一面，它都表示一个序数。比如'A'，它相当于“第65号字符”。而double对于整数的映射关系复杂的多。  不是“相当于”一个字节，它就是一个字节； “表示0~255或者-127~127的整数”：这么精确，你是怎么知道的？ “双字节的char相当于两个字节”：char是单字节的，还有双字节的？你说的是wchar_t吧？ 什么叫“理论上说”，这东西只取决于实现，没听说过取决于理论的。double就是浮点数，怎么会算是整型？这关系太复杂了，类型概念混乱……char本来就是整型，什么叫有类似的一面？char为什么必须表示一个序数？'A'凭什么是65号字符？

user: user-10
content: char可以表示0~127的整形数值，所以可以说是小整形 char, short, int, long这些有可比性，double是浮点数，内存存储编码格式是不同的