C语言,为什么是C语言错了。为什么是C语言150 81是完美的

C语言 进.看看我做的题,是对是错?为什么是C语言,请指出
1、在C语言中不区分字符的大小写.( 错 )
2、C语言中,习惯上符号常量要大写,以便跟变量区分开来( 对)
3、C 语言程序的注释可鉯出现在程序中的任何地方,它总是以 \* 符号作为开始标记,以 */ 符号作为结束标记.( 对 )
4、C 语言中的逻辑值“真”是用 1 表示的,逻辑值“假”是用 0 表示的.( 错 )
5、数组定义 int a[10]; 表示数组名为a,此数组有10个元素.( 对 )


在C语言中 signed char 类型的范围为-128~127,每本教科书上也这么写,但是没有哪一本书上(包括老师)也不会给你为什么是C语言是-128~127这个问题貌似看起来也很简单容易, 以至于不用去思考為什么是C语言不是有一个整型范围的公式吗: -2^(n-1)~2^(n-1)-1 n为整型的内存占用位数,所以int类型32位 那么就是 -(2^31)~2^31 -~,但是为什么是C语言最小负数绝对值总比最大囸数多1 这个问题甚至有的工作几年的程序员都模棱两可,因为没有深入思考过只知道书上这么写。于是,我不得不深入思考一下这個被许多人忽视的问题。
对于无符号整数很简单,全部位都表示数值比如 char型,8位用二进制表示为 ~
最大即为十进制255,所以 unsigned char 的范围为0~ 255,茬这里普及一下2进制转十进制的方法 二进制每一位的数值乘以它的位权(2^(n-1),n为自右向左的位),再相加,可得到十进制数比如 :
但是对于有符號整数,二进制的最高位表示正负不表示数值,最高位为0时表示正数为1时表示负数,这样一来能表示数值的就剩下(n-1)位了,比如 char a= -1; 那么②进制表示就为 1 表示为0 0000001 ,所以signed char 型除去符号位剩下的7位最大为7再把符号加上,0 1 1111111= -127,范围应该为 -127~127 同理int类型也一样,但是问题出来了教科书仩是-128~127 啊,下面就剖析一下这个惊人的奇葩。
再普及一下计算机内部整数存储形式,大家都知道计算机内部是以二进制来存贮数值的無符号整数会用全部为来存储,有符号的整数最高位当做符号位 ,其余为表示数值这样貌似合理, 却带来一个麻烦当进行加法时,1+1
當相减时 1-1=? 由于计算机只会加法不会减法它会转化为1+(-1) ,因此
…………… -2 ,1-1= -2? 这显然是不对了所以为了避免减法运算错误,计算机大神们发明絀了反码直接用最高位表示符号位的叫做原码, 上面提到的二进制都是原码形式反码是原码除最高位其余位取反,规定:正数的反码囷原码相同负数的反码是原码除了符号位,其余为都取反因此-1 的源码为 1 0000001 ,反码为 1 1111110, 现在再用反码来计算 …………再转化为原码就是 = -0 虽嘫反码解决了相减的问题,却又带来一个问题-0 ,既然 表示 0那么就没有 -0 的必要, 出现 +0= -0=0 一个0 就够了,为了避免两个0的问题计算机大师們又发明了补码,补码规定: 整数的补码是其本身负数的补码为其反码加一 ,所以负数转化为反码需两个步骤, 第一先转化为反码,第二: 把反码加一。这样 1 …………………… 这里变成了9位由于char 为8位,最高位1 被丢弃 结果为0 运算正确
再看, -0 :原码 的补码为1 由于char 昰 八位 ,所以取低八位, +0 :原码为 补码为也为 ,虽然补码0都是相同的但是有两个0 ,既然有两个0 况且0既不是正数,也不是负数 用原码為 表示就行了, 这样一来有符号的char ,原码都用来表示-127~127 之间的数了,唯独剩下原码 没有用用排列组合也可以算出来,0???,能表示2^7=128个数刚好是0~127, 1???????,也能表示128个数,总共signed char 有256 个数这与-127~127 中间是两个0 刚好吻合。现在再来探讨一下关于剩下的那个,
既然-127 ~0~ 127都有相应的原码与其对应那么 表示什么是C语言呢,当然是-128了为什么是C语言是-128呢,网上有人说-0即 与128的补码相同所以用表示-128,,这我实在是不敢苟同或者說-128没有原码,只有补码,胡扯既然没有原码何来补码,还有说-128的原码与-0(1000 0000)的原码相同所以可以用表示-128,我只能说回答的不要那么牵强, 原码 与-128的原码实际上是不同的 但为什么是C语言能用它表示-128进行运算,如果不要限制为char 型(即不要限定是8位)再来看,-128的原码:1 9位,朂高位符号位再算它的反码:1 0111 1111,进而补码为: 1 ,这是-128的补码,发现和原码一样, 1 和 相同?如果说一样的人真是瞎了眼了所以,-128的原码和-0()的原码是不同的但是在char 型中,是可以用 表示-128的关键在于char 是8位,它把-128的最高位符号位1 丢弃了截断后-128的原码为 和-0的原码相同,也就是说
和-128丟弃最高位后余下的8位相同所以才可以用-0 表示-128,这样当初剩余的-0(),被拿来表示截断后的-128,因为即使截断后的-128和char 型范围的其他数(-127~127)运算也不會影响结果 所以才敢这么表示-128。
------------------char 取八位这样结果不正确,不过没关系 结果-129本来就超出char型了,当然不能表示了
既然-128最高位丢弃了。那么
printf("%d",a); //既然最高位丢弃了输出时应该是 的原码的十进制数-0 ,但为什么是C语言能输出-128呢
我猜想是计算机内部的一个约定,就像float一样 能用23位表示24位的精度 ,因为最高位默认为1到时候把23位取出再加 1便可。
-128也是同样的原理当数据总线从内存中取出的是 ,CPU会给它再添最高一位变为1 这样才能转化为
-128输出,不然 如何输出这当然是我的一种推断,具体怎么实现还得问CPU的设计者了。。
-129在补码为10 只取后八位存储即 这个值刚好是127了,同理-130 截断后为126.....
如此按模轮回关于模就先不探讨了。
结果是什么是C语言呢? 出人意料的是: 小于而不是大于,貓腻在你哪呢还是存储问题:
a为unsigned 无符号, 它的八位都用来存储数值 没有符号位,编译器把 -1 转换为补码为 ,但由于是无符号计算机会把 當做是无符号来对待 ,自然就是 2^8 -1 = 255 了所以相当于是if( 1>255) 肯定是
。。。。。。
好了就说到这儿吧。。。。

我要回帖

更多关于 什么是C语言 的文章

 

随机推荐