周立波这个月在干啥呢C程序BUG在呢啊

谭浩强《C程序bug设计》纠错笔记(不断更新)
著名计算机科学家沃思(Nikiklause Wirth)&&
点评:Nicklaus Wirth改名了?&
因此C99把字符型数据作为整数类型的一种。
点评:信口开河。
例如,Visual C++ 6.0为char型(字符型)数据分配1个字节,
点评:居然是&例如&...敢问老谭你能否找到一个&例外&?
(1)基本整型(int型)
编译系统分配给int型数据2个字节或4个字节(由具体的C编译系统自行决定)。如Turbo C2.0为每一个整型数据分配2个字节(16个二进位),而Visual C++为每一个整型数据分配4个字节(32位)。在存储单元中的存储方式是:用整数的补码(complement)形式存放。
点评:这段中&整型&的含义前后不一,这是最基本的逻辑错误:概念不清的后果必然是逻辑错乱。&编译系统分配给int型数据2个字节或4个字节&字面意思是int类型只可能有两种可能,这也是错误的。&在存储单元中的存储方式是:用整数的补码(complement)形式存放&,纯属想当然。
在存放整数的存储单元中,最左面一位是用用来表示符号的,如果该位为0,表示数值为正;如果该位为1,表示为负。
点评:unsigned 算不算整数? 哪位表示符号?什么叫&最左面一位&?拜托,那叫&高位&... &表示数值为正&吗?乱!
整数类型的分类
(1)基本整型(int型)
(2)短整型(short int)
(3)长整型(long int)
(4)双长整型(long long int)
点评:最多是对Turbo C2.0和Visual C++6.0的情况进行反复举例而已,并且错误地把补码、一个字节8位这一特殊情况作为了唯一情况。
编译系统分配给long数据4个字节。
点评:想当然。
整型变量的符号属性
点评:暂且不说&符号属性&这个概念是否恰当,即使真有&符号属性&这个概念,那么它也是数据类型的性质,而不是&变量&的性质。
以上介绍的几种数据类型,变量值在存储单元中都是以补码形式存储的。
点评:纯属神论。
因此无符号整型变量中可以存放的正数的范围比一般整型变量中正数的范围扩大一倍。
点评:以两个字节的补码表示形式的int以及unsigned来说,int:1~32767、unsigned:1~65535,这难道是扩大一倍吗?老谭显然掰不开正数和非负数这两个概念的区别。
(2)对无符号整型数据用%u输出。%u表示用无符号十进制数的格式输出。如:
unsigned short price = 50 ;
printf("%u\n",price);
点评:&对无符号整型数据用%u输出&显然是荒谬的,这里的&整型&是个集合概念还是个体概念?如果是集合概念,陈述显然是错误的。如果是个体概念(unsigned int)怎么可以用short举例?老谭显然不清楚printf("%u\n",price)函数调用中的price表达式的真实类型输出正确结果其实是张冠李戴之后瞎蒙碰出来的结果。&无符号十进制数&也属于臆造词语。
在将一个变量定义为无符号整型后,不应向它赋予一个负值,否则就会得到错误的结果。如:
unsigned short price = - 1 ;//不能把一个负整数存储在无符号变量中
printf("%d\n",price);
得到的结果为65535.显然于原意不符。
思考:这是为什么?
原因是:系统对-1先转换成补码形式。就是全部二进制位都是1(见图3.8),然后把它存入变量price中。由于price是无符号短整型变量,其左面第一位不代表符号,按%d格式输出,就是65536.
点评:这段文字至
分享这篇日志的人也喜欢
做回我自己
此处没有标题
热门日志推荐
人人最热标签
北京千橡网景科技发展有限公司:
文网文[号??京公网安备号?甲测资字
文化部监督电子邮箱:wlwh@??
文明办网文明上网举报***: 举报邮箱:&&&&&&&&&&&&
请输入手机号,完成注册
请输入验证码
密码必须由6-20个字符组成
下载人人客户端
品评校花校草,体验校园广场

参考资料

 

随机推荐