鱼C论坛

 找回密码
 立即注册
查看: 3049|回复: 10

c语言编写双符号和进制位溢出怎么写

[复制链接]
发表于 2022-10-5 19:35:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
c语言编写双符号和进制位溢出怎么写
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-10-5 19:51:30 | 显示全部楼层
        举例说明什么是所谓的
双符号和进制位溢出
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-7 11:54:32 | 显示全部楼层
什么意思?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-16 16:29:52 | 显示全部楼层

就是用c语言编写溢出,给出两个二进制数让其相加减,看其是否大于1或者小于-1
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-16 18:04:25 | 显示全部楼层
2861913457 发表于 2022-10-16 16:29
就是用c语言编写溢出,给出两个二进制数让其相加减,看其是否大于1或者小于-1

意思是给出两个二进制数A,B,看相减大于1或小于-1?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-16 23:46:42 | 显示全部楼层
本帖最后由 人造人 于 2022-10-16 23:49 编辑
2861913457 发表于 2022-10-16 16:29
就是用c语言编写溢出,给出两个二进制数让其相加减,看其是否大于1或者小于-1
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. void and_gate(char a, char b, char *c) {
  5.     *c = a == '1' && b == '1' ? '1' : '0';
  6. }

  7. void or_gate(char a, char b, char *c) {
  8.     *c = a == '0' && b == '0' ? '0' : '1';
  9. }

  10. #if 0
  11. void xor_gate(char a, char b, char *c) {
  12.     *c = a != b ? '1' : '0';
  13. }
  14. #else
  15. void not_gate(char a, char *b) {
  16.     *b = a == '1' ? '0' : '1';
  17. }

  18. void xor_gate(char a, char b, char *c) {
  19.     char na, nb;
  20.     char r0, r1;
  21.     not_gate(a, &na);
  22.     not_gate(b, &nb);
  23.     and_gate(a, nb, &r0);
  24.     and_gate(b, na, &r1);
  25.     or_gate(r0, r1, c);
  26. }
  27. #endif

  28. void half_adder_1bit(char a, char b, char *s, char *c) {
  29.     xor_gate(a, b, s);
  30.     and_gate(a, b, c);
  31. }

  32. void full_adder_1bit(char a, char b, char ci, char *s, char *co) {
  33.     char temp_s, temp_c[2];
  34.     half_adder_1bit(a, b, &temp_s, &temp_c[0]);
  35.     half_adder_1bit(temp_s, ci, s, &temp_c[1]);
  36.     or_gate(temp_c[0], temp_c[1], co);
  37. }

  38. void full_adder_2bit(const char *a, const char *b, char ci, char *s, char *co) {
  39.     char temp_c;
  40.     full_adder_1bit(a[1], b[1], ci, &s[1], &temp_c);
  41.     full_adder_1bit(a[0], b[0], temp_c, &s[0], co);
  42. }

  43. void full_adder_4bit(const char *a, const char *b, char ci, char *s, char *co) {
  44.     char temp_c;
  45.     full_adder_2bit(&a[2], &b[2], ci, &s[2], &temp_c);
  46.     full_adder_2bit(&a[0], &b[0], temp_c, &s[0], co);
  47. }

  48. void full_adder_8bit(const char *a, const char *b, char ci, char *s, char *co) {
  49.     char temp_c;
  50.     full_adder_4bit(&a[4], &b[4], ci, &s[4], &temp_c);
  51.     full_adder_4bit(&a[0], &b[0], temp_c, &s[0], co);
  52. }

  53. void full_adder_16bit(const char *a, const char *b, char ci, char *s, char *co) {
  54.     char temp_c;
  55.     full_adder_8bit(&a[8], &b[8], ci, &s[8], &temp_c);
  56.     full_adder_8bit(&a[0], &b[0], temp_c, &s[0], co);
  57. }

  58. void full_adder_32bit(const char *a, const char *b, char ci, char *s, char *co) {
  59.     char temp_c;
  60.     full_adder_16bit(&a[16], &b[16], ci, &s[16], &temp_c);
  61.     full_adder_16bit(&a[0], &b[0], temp_c, &s[0], co);
  62. }

  63. void binary(char dest[const 32], const char *src) {
  64.     memset(dest, '0', 32);
  65.     size_t l = strlen(src);
  66.     strncpy(dest + (32 - l), src, l);
  67. }

  68. void format(char *dest, const char src[const 32]) {
  69.     const char *p = NULL;
  70.     for(size_t i = 0; i < 32; ++i) {
  71.         if(src[i] == '1') {p = &src[i]; break;}
  72.     }
  73.     if(!p) p = src + 31;
  74.     while(p != src + 32) *dest++ = *p++;
  75.     *dest = '\0';
  76. }

  77. char *add(const char *a, const char *b) {
  78.     char *a_ = malloc(32), *b_ = malloc(32);
  79.     char *c = malloc(33);
  80.     binary(a_, a); binary(b_, b);
  81.     char ci = '0', co;
  82.     full_adder_32bit(a_, b_, ci, c, &co);
  83.     //format(c, c);
  84.     c[32] = '\0';
  85.     free(a_); free(b_);
  86.     return c;
  87. }

  88. void neg(char num[const 32]) {
  89.     for(size_t i = 0; i < 32; ++i) {
  90.         xor_gate('1', num[i], &num[i]);
  91.     }
  92.     char ci = '0', co;
  93.     char one[32] = "00000000000000000000000000000001";
  94.     full_adder_32bit(num, one, ci, num, &co);
  95. }

  96. char *sub(const char *a, const char *b) {
  97.     char *a_ = malloc(32), *b_ = malloc(32);
  98.     char *c = malloc(33);
  99.     binary(a_, a); binary(b_, b);
  100.     neg(b_);
  101.     char ci = '0', co;
  102.     full_adder_32bit(a_, b_, ci, c, &co);
  103.     //format(c, c);
  104.     c[32] = '\0';
  105.     free(a_); free(b_);
  106.     return c;
  107. }

  108. int main(void) {
  109.     char a[33];
  110.     char b[33];
  111.     scanf("%32s", a);
  112.     scanf("%32s", b);
  113.     char *c0 = add(a, b);
  114.     puts(c0);
  115.     if(c0[0] != '1') printf("大于1\n");
  116.     free(c0);
  117.     char *c1 = sub(a, b);
  118.     puts(c1);
  119.     if(c1[0] == '1' && c1[31] != '1') printf("小于-1\n");
  120.     free(c1);
  121.     return 0;
  122. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-17 00:10:03 | 显示全部楼层
判断的部分不对,改一改
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <stdint.h>

  5. void and_gate(char a, char b, char *c) {
  6.     *c = a == '1' && b == '1' ? '1' : '0';
  7. }

  8. void or_gate(char a, char b, char *c) {
  9.     *c = a == '0' && b == '0' ? '0' : '1';
  10. }

  11. #if 0
  12. void xor_gate(char a, char b, char *c) {
  13.     *c = a != b ? '1' : '0';
  14. }
  15. #else
  16. void not_gate(char a, char *b) {
  17.     *b = a == '1' ? '0' : '1';
  18. }

  19. void xor_gate(char a, char b, char *c) {
  20.     char na, nb;
  21.     char r0, r1;
  22.     not_gate(a, &na);
  23.     not_gate(b, &nb);
  24.     and_gate(a, nb, &r0);
  25.     and_gate(b, na, &r1);
  26.     or_gate(r0, r1, c);
  27. }
  28. #endif

  29. void half_adder_1bit(char a, char b, char *s, char *c) {
  30.     xor_gate(a, b, s);
  31.     and_gate(a, b, c);
  32. }

  33. void full_adder_1bit(char a, char b, char ci, char *s, char *co) {
  34.     char temp_s, temp_c[2];
  35.     half_adder_1bit(a, b, &temp_s, &temp_c[0]);
  36.     half_adder_1bit(temp_s, ci, s, &temp_c[1]);
  37.     or_gate(temp_c[0], temp_c[1], co);
  38. }

  39. void full_adder_2bit(const char *a, const char *b, char ci, char *s, char *co) {
  40.     char temp_c;
  41.     full_adder_1bit(a[1], b[1], ci, &s[1], &temp_c);
  42.     full_adder_1bit(a[0], b[0], temp_c, &s[0], co);
  43. }

  44. void full_adder_4bit(const char *a, const char *b, char ci, char *s, char *co) {
  45.     char temp_c;
  46.     full_adder_2bit(&a[2], &b[2], ci, &s[2], &temp_c);
  47.     full_adder_2bit(&a[0], &b[0], temp_c, &s[0], co);
  48. }

  49. void full_adder_8bit(const char *a, const char *b, char ci, char *s, char *co) {
  50.     char temp_c;
  51.     full_adder_4bit(&a[4], &b[4], ci, &s[4], &temp_c);
  52.     full_adder_4bit(&a[0], &b[0], temp_c, &s[0], co);
  53. }

  54. void full_adder_16bit(const char *a, const char *b, char ci, char *s, char *co) {
  55.     char temp_c;
  56.     full_adder_8bit(&a[8], &b[8], ci, &s[8], &temp_c);
  57.     full_adder_8bit(&a[0], &b[0], temp_c, &s[0], co);
  58. }

  59. void full_adder_32bit(const char *a, const char *b, char ci, char *s, char *co) {
  60.     char temp_c;
  61.     full_adder_16bit(&a[16], &b[16], ci, &s[16], &temp_c);
  62.     full_adder_16bit(&a[0], &b[0], temp_c, &s[0], co);
  63. }

  64. void binary(char dest[const 32], const char *src) {
  65.     memset(dest, '0', 32);
  66.     size_t l = strlen(src);
  67.     strncpy(dest + (32 - l), src, l);
  68. }

  69. void format(char *dest, const char src[const 32]) {
  70.     const char *p = NULL;
  71.     for(size_t i = 0; i < 32; ++i) {
  72.         if(src[i] == '1') {p = &src[i]; break;}
  73.     }
  74.     if(!p) p = src + 31;
  75.     while(p != src + 32) *dest++ = *p++;
  76.     *dest = '\0';
  77. }

  78. char *add(const char *a, const char *b) {
  79.     char *a_ = malloc(32), *b_ = malloc(32);
  80.     char *c = malloc(33);
  81.     binary(a_, a); binary(b_, b);
  82.     char ci = '0', co;
  83.     full_adder_32bit(a_, b_, ci, c, &co);
  84.     //format(c, c);
  85.     c[32] = '\0';
  86.     free(a_); free(b_);
  87.     return c;
  88. }

  89. void neg(char num[const 32]) {
  90.     for(size_t i = 0; i < 32; ++i) {
  91.         xor_gate('1', num[i], &num[i]);
  92.     }
  93.     char ci = '0', co;
  94.     char one[32] = "00000000000000000000000000000001";
  95.     full_adder_32bit(num, one, ci, num, &co);
  96. }

  97. char *sub(const char *a, const char *b) {
  98.     char *a_ = malloc(32), *b_ = malloc(32);
  99.     char *c = malloc(33);
  100.     binary(a_, a); binary(b_, b);
  101.     neg(b_);
  102.     char ci = '0', co;
  103.     full_adder_32bit(a_, b_, ci, c, &co);
  104.     //format(c, c);
  105.     c[32] = '\0';
  106.     free(a_); free(b_);
  107.     return c;
  108. }

  109. uint32_t number(const char n[const 32]) {
  110.     uint32_t rv = 0;
  111.     const char *p = n;
  112.     for(uint32_t mask = 0x80000000; mask; mask >>= 1) {
  113.         if(*p++ == '1') rv |= mask;
  114.     }
  115.     return rv;
  116. }

  117. int main(void) {
  118.     char a[33];
  119.     char b[33];
  120.     scanf("%32s", a);
  121.     scanf("%32s", b);
  122.     char *c0 = add(a, b);
  123.     puts(c0);
  124.     uint32_t cu0 = number(c0);
  125.     printf("%u\n", cu0);
  126.     if(cu0 > 1 && cu0 < 0x80000000) printf("大于1\n");
  127.     free(c0);
  128.     char *c1 = sub(a, b);
  129.     puts(c1);
  130.     uint32_t cu1 = number(c1);
  131.     printf("%d\n", (int32_t)cu1);
  132.     if(cu1 >= 0x80000000 && cu1 < 0xffffffff) printf("小于-1\n");
  133.     free(c1);
  134.     return 0;
  135. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-17 00:12:34 | 显示全部楼层
我为什么不这么写呢?很奇怪

  1. int main(void) {
  2.     char a[33];
  3.     char b[33];
  4.     scanf("%32s", a);
  5.     scanf("%32s", b);
  6.     char *c0 = add(a, b);
  7.     puts(c0);
  8.     uint32_t cu0 = number(c0);
  9.     printf("%u\n", cu0);
  10.     if((int32_t)cu0 > 1) printf("大于1\n");
  11.     free(c0);
  12.     char *c1 = sub(a, b);
  13.     puts(c1);
  14.     uint32_t cu1 = number(c1);
  15.     printf("%d\n", (int32_t)cu1);
  16.     if((int32_t)cu1 < -1) printf("小于-1\n");
  17.     free(c1);
  18.     return 0;
  19. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-17 07:38:33 | 显示全部楼层
人造人 发表于 2022-10-17 00:12
我为什么不这么写呢?很奇怪

你是写完了前面的才发现可以更简单,还是写一半时发现的?最恶心的是写一半时发现,是选择继续完成啊?还是重开?对于选择困难症的人太恶心了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-17 13:28:59 | 显示全部楼层
jhq999 发表于 2022-10-17 07:38
你是写完了前面的才发现可以更简单,还是写一半时发现的?最恶心的是写一半时发现,是选择继续 ...

    printf("%d\n", (int32_t)cu1);
写完发现的,这条语句发现的

如果写一半发现不对,那就及时纠正
错误要及时纠正,不要一错再错

不重开,在已经写了的代码的基础上修改就好
如果你发现没办法在已有的代码的基础上修改
那说明你一开始在考虑这个问题的时候想的不够全面,或者没有给可能会发生的那些变化留出足够的余地
这是你的设计问题
写代码之前应该得想好,你得有这个程序的整体布局
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-17 14:48:02 | 显示全部楼层
人造人 发表于 2022-10-17 13:28
printf("%d\n", (int32_t)cu1);
写完发现的,这条语句发现的

受教了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-23 08:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表