免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1658 | 回复: 5
打印 上一主题 下一主题

希望初学者进入,可能对你学习有帮助。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-01-27 13:32 |只看该作者 |倒序浏览
下边是我与我的一个学生做的一次对话,后觉得内容可能对其他初学者有帮助,所以,整理如下:
Q----------------------------------------------------------------
哈哈 我现在对C就会写 int a,b,c
A----------------------------------------------------------------
呵呵,你认为这句很简单吗?
Q----------------------------------------------------------------
不是吧? 又刺激我?
A---------------------------------------------------------------
学C要在这个层次上理解和掌握。
这句是声明。和初始化有什么区别?声明的本质是什么?int类型标准是占几个字节?当接收float类型的时候,int类型会做什么操作?当在int类型的最大数上再加1的时候,出现什么情况?为什么?
Q--------------------------------------------------------------------
我投降了。。。
A--------------------------------------------------------------------
呵呵,这个是学会C的标准。我想只能算是掌握C,其实,不要觉得难,这个是要一步一步掌握的,不是一下就会的,多看看书,这个问题没什么难度了

/*声明和初始化有什么区别?声明的本质是什么?*/

C是强类型语言,与其说强类型语言不如说成比较"笨"的一种编译器。
在C中声明变量其实是由人告诉编译器2个信息,1要在内存中开辟多大的空间,2这个空间内存储的数据是什么"编码"

而初始化,是在这个空间内最先放什么数值进去

所以,C的要求是先声明后初始再使用
Q------------------------------------------------------------------
这个我能看明白
A------------------------------------------------------------------
/*int类型标准是占几个字节?*/
上边的明白了,这个问题就好理解,这个是C标准定义的时候的一个约定,一般按照ANSI C89标准int占2-4字节,不能少于2字节

/*当接收float类型的时候,int类型会做什么操作?*/
当float赋值给int类型的时候,会做截断操作,就是不要小数点后边的数据,只保留整数。在这里没有所谓的45规则。要是flaot和int运算的话,就发生类型转换了,这个主要是因为2点,你能猜到吧?
Q---------------------------------------------------------------------------
浮点型赋值给整形 不做四舍五入 之保留小数点前的整数位 浮点型和整形做运算 那就是把小数点前的数做操作?
A---------------------------------------------------------------------------
呵呵,我说的做转换是指,int 数据先要转化到float类型,所以,就相当于两个float在做运算,这样结果就是float。但是,我问你,你能说出为什么做这个转化吗?之前已经说了哦
Q----------------------------------------------------------------------------
联系不到一快去啊。。。
A--------------------------------------------------------------------------

回忆... ...
  声明和初始化有什么区别?
C是强类型语言,与其说强类型语言不如说成比较"笨"的一种编译器。
在C中声明变量其实是由人告诉编译器2个信息,1要在内存中开辟多大的空间,2这个空间内存储的数据是什么"编码"
    ... ...

如果所有类型这两个信息都一样,那还用告诉编译器吗?
Q------------------------------------------------------------------------------
我想是不用,对吧
A------------------------------------------------------------------------------


但是你要告诉编译器,那就是这两个信息对不同类型来说是不一样
Q------------------------------------------------------------------------------

哦。。。。这个就是声明的原因喽
A------------------------------------------------------------------------------
试想一下,一个4字节的float和2字节的int,在做加的时候,你说电脑会拿int那2字节和float4字节中的那两个对齐?高2个?中间2个?最底2个?还是任意2个?这个显然没发确定,所以,CPU决定的是把int也变成4字节(这个不是在内存中,而是在CPU的寄存器中),然后,4个对4个
Q-------------------------------------------------------------------------------

这个说法好理解 。。。
A--------------------------------------------------------------------------------
所以,我想你明白这个就能知道,一个在不同类型之间运算的基本规则了,那就是窄字节类型向宽字节类型转变

还有一个规则就是,不同类型运算,结果是宽类型

呵呵,不是什么说法,而是事实如此
Q--------------------------------------------------------------------------------
o 明白了
A------------------------------------------------------------------------------
当然,这里边还有一些没有说到的就是,我没去考虑"编码"不同的,怎么做转换,这个就算留给你的作业,自己找些资料看看,应该问题不大
Q--------------------------------------------------------------------------------

A----------------------------------------------------------------------------------
/*当在int类型的最大数上再加1的时候,出现什么情况?为什么?*/
ip地址中的1个字节做2进制和10进制转化你知道。所以,你说2字节int 的最大值是多少?用2进制表示是什么样?
Q-------------------------------------------------------------------------------------
65535
A------------------------------------------------------------------------------------
2字节最大表示到十进制的65535,但在C中的int的最大数是+32767,为什么?
Q--------------------------------------------------------------------------------------
还有负数位最小到-3XXXX的那个。。。
-32768

这个吧?
A---------------------------------------------------------------------------------------
因为,最高位就是第16位,作为正负数的标志了,所以,在C中int取值范围是32767到-32768

那int 最大值的二进制是

高0111 1111 1111 1111低

那就是说最高位是0表示正数,是1表示负数,那负数最大二进制是什么?
Q----------------------------------------------------------------------------

1111 1111 1111 1111?
A----------------------------------------------------------------------------
不对,而是
高1000 0000 0000 0000低
Q----------------------------------------------------------------------------
我是真有点想好好学学C了。。。
A----------------------------------------------------------------------------
正数用补码,负数用反码,为什么这么麻烦?
因为,在计算机看来0是正整数!
这个明白?
Q---------------------------------------------------------------------------
基本明白了 以前在学校的C课程里有点接触。。。

还有点印象。。。
A----------------------------------------------------------------------------
正数最大 高0111 1111 1111 1111低
负数最大 高1000 0000 0000 0000低

/*那你说再说当在int类型的最大数上再加1的时候,出现什么情况?为什么?*/

呵呵,应该知道了吧 ?
Q——————————————————————————————————

成负数了。。。?
A____________________________________________________

对,就是在32767上在加1就结果就变成-32768


刚才说的有不准确的,就是
负数最大 高1000 0000 0000 0000低
应该是
负数中最小的。

论坛徽章:
0
2 [报告]
发表于 2007-01-27 13:34 |只看该作者
希望以上能帮助初学者理解一些内容,当然,这个我并没有再做什么修正只是原内容的剪贴,可能会存在不严谨或者不准确的地方,还希望大家帮助斧正!在此先谢谢了!

论坛徽章:
0
3 [报告]
发表于 2007-01-27 15:36 |只看该作者
嘿嘿 ~~
学习了
跟谭老师那本书上的 差不多

不过说 int 最大 是 32767 不对吧
我的机子上的 再加 10个  32767 都没变负的呢 .....

论坛徽章:
0
4 [报告]
发表于 2007-01-27 15:37 |只看该作者
>> 2字节最大表示到十进制的65535,但在C中的int的最大数是+32767
>> 在C中int取值范围是32767到-32768

2 字节的 int 的最大值是 32767 是对的,但是最小值是多少要取决于实现,即负数是用什么方式表示的。可能是 -32768,也可能是 -32767;前者似乎更常见一些。

>> 那你说再说当在int类型的最大数上再加1的时候,出现什么情况?为什么?
>> 成负数了

由于计算结果超出了 int 的范围,所以是无定义的。不过,变成复数的实现比较常见罢了。

论坛徽章:
0
5 [报告]
发表于 2007-01-27 16:01 |只看该作者
为什么11.0458在用%.2lf输出的 时候是11.04
为什么11.5458在用%.2lf输出的时候是11.55

GCC/TC环境均测试过

论坛徽章:
0
6 [报告]
发表于 2007-01-27 19:45 |只看该作者
int 的范围似乎与实现有关吧?C标准里面没有规定具体范围吧阿?有关int的范围一般在limits.h里面说明了。但是不同机器上可能不相同阿?我说错没有?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP