基于C语言实现的hw6整数运算器

骑猪看日落 2024-04-07 15:21 181阅读 0赞

hw6 整数运算器

一、算法分析

原理:

  • 两数之和的补码等于补码之和的补码。
  • 两数之差等于减数与被减数的相反数之和,也满足加法定律。
  • 两数乘积为若干次加法之和,也满足加法定律。

二、优缺点

  • 原码表示数字较为直接,但运算不便
  • 补码的优点是能使符号位与有效值部分一起参与运算,从而简化了运算规则,但不易直接看出数字大小。
  • 移码是在补码的基础上把首位取反得到的,这样使得移码非常适合于阶码的运算。

三、补码的溢出

补码运算的溢出判别方式为双高位判别法,利用CS表示符号位是否进位,利用CP表示最高数值位是否进位。如果CS ^ CP的结果为真,则代表发生了溢出(例如正数+正数得到负数),否则没有溢出。

四、大小比较

先比较符号位,即最高位,1为负数0为正数(负数肯定小于正数),然后由高位向低位进行 字典序依次比较,如果这个数是正数即符号位为0,则字符串比较(字典序)结果大的数,其 值大;如果为负数,则字符串比较(字典序)结果小的数,其值反而大

符号扩展 如果为负数,则在高位上补1,正数则补0。

五、代码及测试

  1. #include<iostream>
  2. #include<string>
  3. using namespace std;
  4. typedef unsigned long word;
  5. //补码表示
  6. word atom(char *s) {//字符串转数
  7. bool isneg = false;
  8. word i, result;
  9. i = result = 0;
  10. if (s[0] == '-') {
  11. isneg = true;
  12. i++;
  13. }
  14. while (s[i] != '\0') {
  15. result = result * 10 + s[i++] - '0';
  16. }
  17. if (isneg) {
  18. return 0xFFFFFFFF - result + 1;
  19. }
  20. else
  21. return result;
  22. }
  23. word madd(word a, word b) {
  24. word sum = a;
  25. word carry = b;
  26. word tmp;
  27. while (carry) {
  28. tmp = sum;
  29. sum = sum ^ carry;
  30. carry = (tmp & carry) << 1;
  31. }
  32. return sum;
  33. }
  34. word msub(word a, word b) {
  35. return madd(a, madd(~b, 1));//a + b补码
  36. }
  37. word mmut(word x, word y) {// booth算法
  38. bool isneg = (x >> 31) ^ (y >> 31);
  39. word result = 0;
  40. x = (x >> 31) ? madd(~x, 1) : x;
  41. y = (y >> 31) ? madd(~y, 1) : y;
  42. while(y){
  43. if(y & 1){
  44. result += x;
  45. y >>= 1;
  46. x <<= 1;
  47. }
  48. }
  49. if(isneg)
  50. return madd(~result, 1);
  51. else
  52. return result;
  53. }
  54. word mdiv(word x, word y) {
  55. bool isneg = (x >> 31) ^ (y >> 31);
  56. word a, b;
  57. word result = 0;
  58. a = (x >> 31) ? madd(~x, 1) : x;
  59. b = (y >> 31) ? madd(~y, 1) : y;
  60. for (int i = 31; i >= 0; i--) {
  61. if ((a >> i) >= b) {
  62. result += (1 << i);
  63. a -= (b << i);
  64. }
  65. }
  66. if (isneg)
  67. return madd(~result, 1);
  68. else
  69. return result;
  70. }
  71. word mmod(word x, word y) {
  72. word a, b, result = 0;
  73. a = (x >> 31) ? madd(~x, 1) : x;
  74. b = (y >> 31) ? madd(~y, 1) : y;
  75. result = msub(x, mmut(mdiv(x, y), y));
  76. if (result >> 31)
  77. return madd(~result, 1);
  78. else
  79. return result;
  80. }
  81. char* mtoa(word n) {//数转字符串
  82. char str[40];
  83. word i = 0;
  84. while (i < 32) {
  85. if (n >> (31 - i) & 1) {
  86. str[i] = '1';
  87. }
  88. else
  89. str[i] = '0';
  90. i++;
  91. }
  92. str[i] = '\0';
  93. return str;
  94. }
  95. int main() {
  96. word n = -127;
  97. cout << mtoa(n) << endl;
  98. char nn[33] = "127";
  99. cout << atom(nn) << endl;
  100. word a = 125;
  101. word b = 127;
  102. printf("%d - %d = %X\n", a, b, msub(a, b));
  103. printf("%d x %d = %d\n", a, b, mmut(a, b));
  104. a = 256;
  105. b = -16;
  106. printf("%d / %d = %d\n", a, b, mdiv(a, b));
  107. }

在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,181人围观)

还没有评论,来说两句吧...

相关阅读

    相关 C语言整数

    文章目录 一、整数的概念 二、整数的取值范围 三、整数的输出 四、二进制数、八进制数和十六进制数的书写 1、二进制 2、

    相关 C语言整数

      整数的概念        在之前的章节中,我们已经用过整数了,也定义过整型变量,好像没什么好讲的,整数就是整数。        整数是我们生活中常用的数据类型,也