user-0 提问: 全新新手问C语言基础

回复:
user: user-1
content: 你想彻底搞明白这个问题, 还是应该去学习微机原理, 至少学会一种汇编语言. 而不是在高层语言的角度纠结这些问题.

user: user-1
content: 1. 对计算机来说没有数据类型的概念, 只有字节, 双字节, 字这样的类型. 数据类型是给人理解的. 计算机中保存的数据, 由某个程序(如编译器, 操作系统, 或你自己写的程序) 翻译出来显示给人看. 计算机里保存了1000001, 解释程序就把'A'显示到屏幕上了. 2. 如果你不是做底层的, 应该不用. 如果做底层, 至少你用到的系统要明白. 3. 这个和编码方式有关, 现在计算机绝大部分都用的ASCII编码, 这样'A'就是保存的1000001. 在一些特殊的计算机上, 用EBCDIC等其他编码, 就会是其他值.  你说的代码都是给人看, 对计算机来说只有数字, 计算机的CPU里有电路把一些特殊的数字解释成计算机执行的命令, 其他的数字是什么含意需要有软件(包括操作系统, 编译器, 应用软件)来解释.

user: user-2
content: 引用 2 楼 zhao4zhong1 的回复:推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。） 这特么是什么回答,牛头不对马嘴的。

user: user-3
content: 所有的字符都是以ascii码存的，大写a存的就是65.输出的时候转成字符输出。 搞清本质，本质上来说计算机的存储数据类型只有实型和整形。 char型的会按int型存储但是只占八位。其他位作为保留位清0. 至于自然字，长度应该是根据计算机的硬件传输数据的位数以及所装操作系统的编译器来决定的。

user: user-4
content: 把自己的大脑想像成cpu,cpu才不管你什么数据类型,cpu只负责执行机器码.为了不让cpu乱来,编译器出马了.编译器说你的数据在这里,他的大小是4Byte,于是就有了数据类型.大体就是这么个事了.

user: user-0
content: 引用 5 楼 truelance 的回复:1. 你打开文件看到的是源代码, 书上讲的多少位都是目标程序运行时占用的空间大小, 这两者不一定一样. 2. 和编译器有关, 同一种编程语言都可能不同, 不同的编程语言当然更可能不同. 3. 在高级语言的语义上有区别, 在机器语言层面无区别. 11111111在signed是-127, unsigned是255, 在高级语言层面不等, 因为实际比较时会变成0x000000ff和0xffffffff比较, 两个不一样. 如果是在机器语言层面用字节比较两个11111111结果是一样.  1 是的 但是既然编码方式对应的是字符和代码之间的转换关系 而我们在打字的时候 打了A 虽然它不是在运行时的字符A（那样的话应该打'A'） 但是在计算机显示器上确实出现了A 那么我可以说 在源文件中这个A的代码其实应该是根据编码方式保存的代码吧？我想了解这个有没有数据类型？  2 不好意思我确实是新手 能否说明一下这个是否需要硬背？或者有什么方式得出？  3 您所说的机器语言层面 高级语言层面 这个我还不懂 之后回去会学习 但是我想问一下 所谓的“字符是以数字形式储存的” 在程序运行阶段 难道是说代码还是用数字组成的这样的话？？？ 难道不是指与代码无关 而是代码本身的意义是一个数字的意思吗？ 就像代码11111111的意义是-128一样 那么字符A的码值是65 指的是代码是“二进制的65（1000001）” 还是可能是任何代码（比如11010010） 但是这个代码代表的意义是65？

user: user-5
content: sizeof(char) = 1 即char占1 byte (8 bits) 但是 C中'A'是int类型 C++中'A'是char类型 这是标准规定的  word：http://en.wikipedia.org/wiki/Word_(computer_architecture)  #3：计算机只能认得数字65，至于'A'，那是人们把它编码成65（0x41） 注意，这是ASCII编码方式 在EBCDIC CP037中，'A'被编码成0xC1

user: user-6
content: 对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和 寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时 候。  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！

user: user-0
content: 引用 1 楼 truelance 的回复:1. char类型的变量是8位, 但字符常量是int类型 2. 和计算机的字长以及编译器都有关系. 3. 你要分清楚源代码和计算机内保存的数据之间的区别.    源代码是给人看的, 就是按人的逻辑定义的, 'A'就是'A'    计算机内保存的数据都是二进制数据, 按ASCII编码方式, 'A'的编码是二进制1000001, 相当于10进制的65.    你当然把另外定义一套编码, 把计算机保存的1000001当作二进制的1,也就是10进制的1; 然后把计算机保存的11111111当作二进制的1000001,也就是10进制的65. 但这样就需要你自己制造计算机、操作系统、编译器等等一系列的东西。 在真实的世界里，编码都是有规范的，计算机中保存的数据，在你的类型确定的情况下(unsigned/signed)表示的意义是唯一的。这样在c这种比较偏向计算机的语言中， 'A'和65就是等价的。  关于3我可以接受在编写时输入'A' 在程序运行时对应65 但是我想知道它的代码 是不是就是把65变成二进制的形式写出来的 在数据对象中储存的值 是不是也都是这个数 我可以将其推广为只要我知道了代码是怎么写的 就能换算成十进制得出储存的值吗 还有在编写时如果输入的是A 而在源文件的源代码找A这里 跟65有关呢？

user: user-0
content: 引用 1 楼 truelance 的回复:1. char类型的变量是8位, 但字符常量是int类型 2. 和计算机的字长以及编译器都有关系. 3. 你要分清楚源代码和计算机内保存的数据之间的区别.    源代码是给人看的, 就是按人的逻辑定义的, 'A'就是'A'    计算机内保存的数据都是二进制数据, 按ASCII编码方式, 'A'的编码是二进制1000001, 相当于10进制的65.    你当然把另外定义一套编码, 把计算机保存的1000001当作二进制的1,也就是10进制的1; 然后把计算机保存的11111111当作二进制的1000001,也就是10进制的65. 但这样就需要你自己制造计算机、操作系统、编译器等等一系列的东西。 在真实的世界里，编码都是有规范的，计算机中保存的数据，在你的类型确定的情况下(unsigned/signed)表示的意义是唯一的。这样在c这种比较偏向计算机的语言中， 'A'和65就是等价的。  多谢你的回答 关于1我知道你回答的意思 在运行时我可以理解 但是我想问一下 很多书都会这么说 一个字符占用一个字节 也就是8位 但是我们平时比如用txt文件打一个A保存 难道字符A在没有运行任何程序时没有代码吗 应该有吧 但是里边的难道是个变量吗？ 难道很多书中说的一个字符占用一个字节 难道这种情况不应该是8位吗 又不应该是常量吗  关于2有没有和程序设计语言的规定有关系？  关于3你的意思是数据对象中储存的值 就是二进制代码"本身转换成十进制写出来的值" 对吧 因为我看见在有符号类型的数据中 比如假设一个无符号8位的int 它的代码11111111我假设是值255 但是同样是11111111 在有符号类型中是-128之类的吧(我知道是不是-128 但肯定在这里又对应了另一个数) 所以我判断代码本身的值和代码意义的值 (或者叫数据对象中储存的值)在相同类型的数据对象中它们一一对应 但并不相等(-128的代码11111111 按照二进制是等于255 而不是-128) 跟你的理解不同 如何解释我的疑问？

user: user-7
content: 引用 5 楼 truelance 的回复:1. 你打开文件看到的是源代码, 书上讲的多少位都是目标程序运行时占用的空间大小, 这两者不一定一样. 2. 和编译器有关, 同一种编程语言都可能不同, 不同的编程语言当然更可能不同. 3. 在高级语言的语义上有区别, 在机器语言层面无区别. 11111111在signed是-127, unsigned是255, 在高级语言层面不等, 因为实际比较时会变成0x000000ff和0xffffffff比较, 两个不一样. 如果是在机器语言层面用字节比较两个11111111结果是一样.看了之后，感觉好像明白了什么

user: user-1
content: 1. 你打开文件看到的是源代码, 书上讲的多少位都是目标程序运行时占用的空间大小, 这两者不一定一样. 2. 和编译器有关, 同一种编程语言都可能不同, 不同的编程语言当然更可能不同. 3. 在高级语言的语义上有区别, 在机器语言层面无区别. 11111111在signed是-127, unsigned是255, 在高级语言层面不等, 因为实际比较时会变成0x000000ff和0xffffffff比较, 两个不一样. 如果是在机器语言层面用字节比较两个11111111结果是一样.

user: user-1
content: 1. char类型的变量是8位, 但字符常量是int类型 2. 和计算机的字长以及编译器都有关系. 3. 你要分清楚源代码和计算机内保存的数据之间的区别.    源代码是给人看的, 就是按人的逻辑定义的, 'A'就是'A'    计算机内保存的数据都是二进制数据, 按ASCII编码方式, 'A'的编码是二进制1000001, 相当于10进制的65.    你当然把另外定义一套编码, 把计算机保存的1000001当作二进制的1,也就是10进制的1; 然后把计算机保存的11111111当作二进制的1000001,也就是10进制的65. 但这样就需要你自己制造计算机、操作系统、编译器等等一系列的东西。 在真实的世界里，编码都是有规范的，计算机中保存的数据，在你的类型确定的情况下(unsigned/signed)表示的意义是唯一的。这样在c这种比较偏向计算机的语言中， 'A'和65就是等价的。

user: user-8
content: 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）