- 论坛徽章:
- 0
|
下边是我与我的一个学生做的一次对话,后觉得内容可能对其他初学者有帮助,所以,整理如下:
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低
应该是
负数中最小的。 |
|