计算机组成原理2作业理解

文章讲述了奇校验码和偶校验码的概念,C语言中无符号和有符号整数之间的转换,以及在编程中遇到的溢出问题,如负数转换为无符号整数时的陷阱。
摘要由CSDN通过智能技术生成

目录

题目一:设有效信息为01011011,分别写出其奇校验码和偶校验码(校验位放在最后)。如果接收到的校验码为 010110100,请说明如何发现错误。

题目二:C语言中允许无符号整数和有符号整数之问的转换,下面是一段C语言代码:

题目三:由3个11”和5个0”组成的8位二进制补码,能表示的最小整数是()。

题目四:考虑以下C语言代码:

题目五:假定编译器规定int和short类型长度分别为32位和16位,执行下列C语言语句:unsigned short x=65530; unsigned int y=x;得到y的机器数是 ()

题目六:有如下C语言程序段:short si=-32767; unsigned short usi=si;执行上述两条语句后,usi的值是 ()


题目一:设有效信息为01011011,分别写出其奇校验码和偶校验码(校验位放在最后)。如果接收到的校验码为 010110100,请说明如何发现错误。

解:奇校验码和偶校验码是通过添加一个额外的位(称为校验位)来检测数据传输中的错误。奇校验码要求每个字节中1的数量为奇数,而偶校验码要求每个字节中1的数量为偶数。

对于给定的有效信息01011011:

  • 奇校验码:在有效信息的末尾添加一个校验位,使得整个信息中1的个数为奇数。对于给定的有效信息01011010,1的个数为5,所以校验位为0。所以,奇校验码为010110110。

  • 偶校验码:在这个字节中,1的数量是奇数,所以我们就可以添加一个1作为校验位。所以,偶校验码为010110111。

  •      如果接收到的校验码为010110100,当使用偶校验时,偶校验码:0101101000,G = 4,无法具体判断;如果使用奇校验,则奇校验码为:0101101001,G = 5,G为奇数则一定有错。

  • 题目二:C语言中允许无符号整数和有符号整数之问的转换,下面是一段C语言代码:

    int x=-1;

    unsigned u=2147483648;

  • printf("×=%u=%d\n",×,×);

  • printf("u=%¼=%d\n",u,u);

    请运行该代码,并给出输出结果及简要分析。

  • 在机器的内存中函数对于有符号整数和无符号整数的理解,以及他能够表示的范围

  • 2的31次方=2147483648

        x为一个有符号整数-1,以无符号整数%u和有符号整数%d的格式打印变量x,由于x是-1,以无符号整数格式打印时,它就会显示为4294967295,该数为32位无符号整数能表示的最大值。以有符号整数格式打印时,它仍然是-1。u为一个无符号整数2147483648,以无符号[和有符号整数%d的格式打印变量u, u的值2147483648以无符号整数格式打印时正确显示,但是以有符号整数格式打印时,它会显示为-2147483648,因为2147483648超出了32位有符号整数的表示范围,导致溢出。

  • 题目三:由3个11”和5个0”组成的8位二进制补码,能表示的最小整数是()。

题目四:考虑以下C语言代码:

unsigned short usi=65535;

short si=usi;

执行上述程序段后,si的值是 ()。

在C语言中,unsigned short类型的变量可以表示的范围是0到65535,而short类型的变量可以表示的范围是-32768到32767。

  当将一个unsigned short类型的变量赋值给一个short类型的变量时,如果这个值超过了short类型的最大值,那么结果会是一个负数。这是因为C语言会将这个值的最高位(也就是符号位)解释为负数。

  而代码中,usi的值是65535,这是unsigned short类型的最大值。当这个值赋值给si时,由于65535超过了short类型的最大值32767,所以si的值会被解释为一个负数。

  具体地说,65535的二进制表示是1111111111111111。当这个值被解释为一个short类型的值时,最高位被解释为符号位,所以这个值会被解释为-1。

所以,执行上述程序段后,si的值是-1。这就是所谓的溢出,是因为一个大的unsigned short值赋值给一个short值时可能发生的现象。这是一种常见的编程错误,需要特别注意。在编写程序时,我们需要确保我们的代码能够正确处理这种情况,或者避免这种情况的发生。如果我们不能确定一个值是否会超过一个类型的范围,那么我们应该使用一个更大的类型,或者使用一种能够处理更大范围的值的数据结构。这是编程中的一个重要原则,也是我们需要时刻牢记的。希望这个解释对你有所帮助!

题目五:假定编译器规定int和short类型长度分别为32位和16位,执行下列C语言语句:unsigned short x=65530; unsigned int y=x;得到y的机器数是 ()

  代码unsigned short x=65530表示x是一个无符号的16位整数,其值为65530。当我们执行unsigned int y=x时,我们实际上是将一个16位的无符号整数赋值给一个32位的无符号整数。在这种情况下,y的值将与x的值相同,即65530,因为无符号整数的赋值不会改变其值。所以,y的机器数是65530的二进制表示。由于y是一个32位的无符号整数,所以我们需要将65530转换为一个32位的二进制数。65530的二进制表示为1111111111111010,但是因为y是32位的,所以我们需要在前面补上16个0,所以y的机器数是00000000000000001111111111111010。然后我们将y的值65530转换为十六进制,我们会得到FFFA。所以,y的十六进制机器数是0000FFFA

15*16^3 + 15*16^2 + 15*16^1 + 10*16^0 = 65530

因为y是一个32位的无符号整数,所以需要在前面补上4个0。

题目六:有如下C语言程序段:short si=-32767; unsigned short usi=si;执行上述两条语句后,usi的值是 ()

在这段代码中,short si=-32767表示si是一个有符号的16位整数,其值为-32767。当我们执行unsigned short usi=si时,我们实际上是将一个有符号的16位整数赋值给一个无符号的16位整数。在这种情况下,usi的值将是si的值加上2^{16},因为无符号整数不能表示负数。

所以,usi的值是-32767 + 2^{16} = 32769。这是因为在二进制表示中,负数通常使用补码表示,而无符号整数则直接表示正数。当我们将一个负的补码数赋值给一个无符号整数时,补码数将被解释为一个大的正数。因此,usi的值是32769。这是一个常见的编程陷阱,需要注意。如果想要保持数值不变,需要确保在赋值之前进行适当的类型转换。

例如,可以先将si转换为一个大于或等于32位的有符号整数,然后再赋值给usi。这样,负数就可以被正确地转换为无符号整数。但是在这个例子中,没有进行这样的转换,所以usi的值是32769。

  • 10
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

邶梓鸭~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值