有符号数的表示:计算机中的数据用二进制表示,数的符号也只能用0/1表示。一般用最高有效位(MSB)来表示数的符号,正数用0表示,负数用1表示。
有符号数的编码方式,常用的是补码,另外还有原码和反码等。用不同二进制编码方式表示有符号数时,所得到的机器数可能不一样,但是真值应该是相同的。
例题:
无符号数是针对二进制来讲的,无符号数的表数范围是非负数。
全部二进制均代表数值,没有符号位。即第一个"0"或"1"不表示正负。
C支持所有整形数据类型的有符号数和无符号数运算。尽管C标准并没有指定某种有符号数的表示,但是几乎所有的机器都使用二进制补码。通常,大多数数字默认都使有符号的,C也允许无符号数和有符号数之间的转换,转换原则是基本的位表示保持不变。当执行一个运算时,如果它的一个运算数是有符号的而另一个是无符号的,那么C会隐含地将有符号参数强制转换为无符号数,并假设这两个数都是非负的,来执行这个运算。
float:单精度,32位
unsigned float:单精度无符号,32位
double:双精度,64位
long double:高双精度,80位
1.p24 进制转换代码
1 #!/bin/perl 2 # Convert list of decimal numbers into hex 3 4 for($i=0;$i<@ARGV;$i++){ 5 printf("%d\t=0x%x\n",$ARGV[$i],$ARGV[$i]); 6 }
#!/bin/perl # Convert list of hex numbers into decimal for($i=0;$i<@ARGV;@i++){ $val = hex($ARGV[$i]); printf("0x%x=%d\n",$val,$val); }
2.p24 show_bytes,写个main函数测试一下,参考p30代码
主函数:
运行结果:
3.p35 练习2.11, 可以用GDB单步跟踪一下,理解更深刻
答案:
问题A:k,k
问题B:假设k=2,,2k+1=5,当达到最后一次循环的时候,first=last=2,a[2]=3. 此时调用函数inplace_swap,在该函数内部得到:
第一步:y=3^3=0
第二步:x=3^0=3
第三步:y=x^y=3^0=3
这是我们希望的结果,但是在实际上2.10采用了指针的方式。当第一步y=3^3=0时,指针y所指向的地址存储的值已经改变,同时x也指向了与y相同的地址,所以此时x=0。因此后面两步没有意义。事实上结果如下:
第一步:y=3^3=0,x=0
第二步:x=0^0=0,y=0
第三步:y=x^y=0^0=0,x=0
问题C:解决方法有两种。
其一可以将for(first = 0, last = cnt - 1;first <= last;first ++, last --)改为for(first = 0, last = cnt -1;first <last;first ++, last --)
其二可以讲inplace_swap函数中的指针xy改为普通变量。
4.p44 代码放到一个main函数中,可以用GDB单步跟踪一下,理解更深刻
gdb调试:
5.p47/p49代码放到一个main函数中,可以用GDB单步跟踪一下,理解更深刻
gdb:
6.p78,转换规则可以写几行代码测试一下。
分别测试了以下几种情况:
int->float
int->double
double->float
double->int
教材家庭作业
代码:
运行结果:
出现的问题及解决方法:
1.因为不了解perl语言,不知道怎样运行,最后自己尝试编写了一份c语言的进制转换,能够成功出现结果。
2.由于实验楼没有加入用户组,出现“没有权限。。。”,加入后可正常操作。
3.gdb无法单步跟踪,总是提示the program is not being run。设置断点后后用run命令也无法停到断点处。在网上查阅后,多少人说是由于gdb自身的问题,需要重新安装。
4.在做最后的家庭作业的时候,出现与题意相反结果,如图:
经过检测,是函数的返回值出现了问题,取了相反值,改正后可正确输出。