鱼C论坛

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

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

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

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

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

x
c语言编写双符号和进制位溢出怎么写
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-5 19:51:30 | 显示全部楼层
        举例说明什么是所谓的
双符号和进制位溢出
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-7 11:54:32 | 显示全部楼层
什么意思?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

就是用c语言编写溢出,给出两个二进制数让其相加减,看其是否大于1或者小于-1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

意思是给出两个二进制数A,B,看相减大于1或小于-1?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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

#if 0
void xor_gate(char a, char b, char *c) {
    *c = a != b ? '1' : '0';
}
#else
void not_gate(char a, char *b) {
    *b = a == '1' ? '0' : '1';
}

void xor_gate(char a, char b, char *c) {
    char na, nb;
    char r0, r1;
    not_gate(a, &na);
    not_gate(b, &nb);
    and_gate(a, nb, &r0);
    and_gate(b, na, &r1);
    or_gate(r0, r1, c);
}
#endif

void half_adder_1bit(char a, char b, char *s, char *c) {
    xor_gate(a, b, s);
    and_gate(a, b, c);
}

void full_adder_1bit(char a, char b, char ci, char *s, char *co) {
    char temp_s, temp_c[2];
    half_adder_1bit(a, b, &temp_s, &temp_c[0]);
    half_adder_1bit(temp_s, ci, s, &temp_c[1]);
    or_gate(temp_c[0], temp_c[1], co);
}

void full_adder_2bit(const char *a, const char *b, char ci, char *s, char *co) {
    char temp_c;
    full_adder_1bit(a[1], b[1], ci, &s[1], &temp_c);
    full_adder_1bit(a[0], b[0], temp_c, &s[0], co);
}

void full_adder_4bit(const char *a, const char *b, char ci, char *s, char *co) {
    char temp_c;
    full_adder_2bit(&a[2], &b[2], ci, &s[2], &temp_c);
    full_adder_2bit(&a[0], &b[0], temp_c, &s[0], co);
}

void full_adder_8bit(const char *a, const char *b, char ci, char *s, char *co) {
    char temp_c;
    full_adder_4bit(&a[4], &b[4], ci, &s[4], &temp_c);
    full_adder_4bit(&a[0], &b[0], temp_c, &s[0], co);
}

void full_adder_16bit(const char *a, const char *b, char ci, char *s, char *co) {
    char temp_c;
    full_adder_8bit(&a[8], &b[8], ci, &s[8], &temp_c);
    full_adder_8bit(&a[0], &b[0], temp_c, &s[0], co);
}

void full_adder_32bit(const char *a, const char *b, char ci, char *s, char *co) {
    char temp_c;
    full_adder_16bit(&a[16], &b[16], ci, &s[16], &temp_c);
    full_adder_16bit(&a[0], &b[0], temp_c, &s[0], co);
}

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

void format(char *dest, const char src[const 32]) {
    const char *p = NULL;
    for(size_t i = 0; i < 32; ++i) {
        if(src[i] == '1') {p = &src[i]; break;}
    }
    if(!p) p = src + 31;
    while(p != src + 32) *dest++ = *p++;
    *dest = '\0';
}

char *add(const char *a, const char *b) {
    char *a_ = malloc(32), *b_ = malloc(32);
    char *c = malloc(33);
    binary(a_, a); binary(b_, b);
    char ci = '0', co;
    full_adder_32bit(a_, b_, ci, c, &co);
    //format(c, c);
    c[32] = '\0';
    free(a_); free(b_);
    return c;
}

void neg(char num[const 32]) {
    for(size_t i = 0; i < 32; ++i) {
        xor_gate('1', num[i], &num[i]);
    }
    char ci = '0', co;
    char one[32] = "00000000000000000000000000000001";
    full_adder_32bit(num, one, ci, num, &co);
}

char *sub(const char *a, const char *b) {
    char *a_ = malloc(32), *b_ = malloc(32);
    char *c = malloc(33);
    binary(a_, a); binary(b_, b);
    neg(b_);
    char ci = '0', co;
    full_adder_32bit(a_, b_, ci, c, &co);
    //format(c, c);
    c[32] = '\0';
    free(a_); free(b_);
    return c;
}

int main(void) {
    char a[33];
    char b[33];
    scanf("%32s", a);
    scanf("%32s", b);
    char *c0 = add(a, b);
    puts(c0);
    if(c0[0] != '1') printf("大于1\n");
    free(c0);
    char *c1 = sub(a, b);
    puts(c1);
    if(c1[0] == '1' && c1[31] != '1') printf("小于-1\n");
    free(c1);
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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

#if 0
void xor_gate(char a, char b, char *c) {
    *c = a != b ? '1' : '0';
}
#else
void not_gate(char a, char *b) {
    *b = a == '1' ? '0' : '1';
}

void xor_gate(char a, char b, char *c) {
    char na, nb;
    char r0, r1;
    not_gate(a, &na);
    not_gate(b, &nb);
    and_gate(a, nb, &r0);
    and_gate(b, na, &r1);
    or_gate(r0, r1, c);
}
#endif

void half_adder_1bit(char a, char b, char *s, char *c) {
    xor_gate(a, b, s);
    and_gate(a, b, c);
}

void full_adder_1bit(char a, char b, char ci, char *s, char *co) {
    char temp_s, temp_c[2];
    half_adder_1bit(a, b, &temp_s, &temp_c[0]);
    half_adder_1bit(temp_s, ci, s, &temp_c[1]);
    or_gate(temp_c[0], temp_c[1], co);
}

void full_adder_2bit(const char *a, const char *b, char ci, char *s, char *co) {
    char temp_c;
    full_adder_1bit(a[1], b[1], ci, &s[1], &temp_c);
    full_adder_1bit(a[0], b[0], temp_c, &s[0], co);
}

void full_adder_4bit(const char *a, const char *b, char ci, char *s, char *co) {
    char temp_c;
    full_adder_2bit(&a[2], &b[2], ci, &s[2], &temp_c);
    full_adder_2bit(&a[0], &b[0], temp_c, &s[0], co);
}

void full_adder_8bit(const char *a, const char *b, char ci, char *s, char *co) {
    char temp_c;
    full_adder_4bit(&a[4], &b[4], ci, &s[4], &temp_c);
    full_adder_4bit(&a[0], &b[0], temp_c, &s[0], co);
}

void full_adder_16bit(const char *a, const char *b, char ci, char *s, char *co) {
    char temp_c;
    full_adder_8bit(&a[8], &b[8], ci, &s[8], &temp_c);
    full_adder_8bit(&a[0], &b[0], temp_c, &s[0], co);
}

void full_adder_32bit(const char *a, const char *b, char ci, char *s, char *co) {
    char temp_c;
    full_adder_16bit(&a[16], &b[16], ci, &s[16], &temp_c);
    full_adder_16bit(&a[0], &b[0], temp_c, &s[0], co);
}

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

void format(char *dest, const char src[const 32]) {
    const char *p = NULL;
    for(size_t i = 0; i < 32; ++i) {
        if(src[i] == '1') {p = &src[i]; break;}
    }
    if(!p) p = src + 31;
    while(p != src + 32) *dest++ = *p++;
    *dest = '\0';
}

char *add(const char *a, const char *b) {
    char *a_ = malloc(32), *b_ = malloc(32);
    char *c = malloc(33);
    binary(a_, a); binary(b_, b);
    char ci = '0', co;
    full_adder_32bit(a_, b_, ci, c, &co);
    //format(c, c);
    c[32] = '\0';
    free(a_); free(b_);
    return c;
}

void neg(char num[const 32]) {
    for(size_t i = 0; i < 32; ++i) {
        xor_gate('1', num[i], &num[i]);
    }
    char ci = '0', co;
    char one[32] = "00000000000000000000000000000001";
    full_adder_32bit(num, one, ci, num, &co);
}

char *sub(const char *a, const char *b) {
    char *a_ = malloc(32), *b_ = malloc(32);
    char *c = malloc(33);
    binary(a_, a); binary(b_, b);
    neg(b_);
    char ci = '0', co;
    full_adder_32bit(a_, b_, ci, c, &co);
    //format(c, c);
    c[32] = '\0';
    free(a_); free(b_);
    return c;
}

uint32_t number(const char n[const 32]) {
    uint32_t rv = 0;
    const char *p = n;
    for(uint32_t mask = 0x80000000; mask; mask >>= 1) {
        if(*p++ == '1') rv |= mask;
    }
    return rv;
}

int main(void) {
    char a[33];
    char b[33];
    scanf("%32s", a);
    scanf("%32s", b);
    char *c0 = add(a, b);
    puts(c0);
    uint32_t cu0 = number(c0);
    printf("%u\n", cu0);
    if(cu0 > 1 && cu0 < 0x80000000) printf("大于1\n");
    free(c0);
    char *c1 = sub(a, b);
    puts(c1);
    uint32_t cu1 = number(c1);
    printf("%d\n", (int32_t)cu1);
    if(cu1 >= 0x80000000 && cu1 < 0xffffffff) printf("小于-1\n");
    free(c1);
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-17 00:12:34 | 显示全部楼层
我为什么不这么写呢?很奇怪
int main(void) {
    char a[33];
    char b[33];
    scanf("%32s", a);
    scanf("%32s", b);
    char *c0 = add(a, b);
    puts(c0);
    uint32_t cu0 = number(c0);
    printf("%u\n", cu0);
    if((int32_t)cu0 > 1) printf("大于1\n");
    free(c0);
    char *c1 = sub(a, b);
    puts(c1);
    uint32_t cu1 = number(c1);
    printf("%d\n", (int32_t)cu1);
    if((int32_t)cu1 < -1) printf("小于-1\n");
    free(c1);
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

你是写完了前面的才发现可以更简单,还是写一半时发现的?最恶心的是写一半时发现,是选择继续完成啊?还是重开?对于选择困难症的人太恶心了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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

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

使用道具 举报

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

受教了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-27 11:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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