如何在C中检查一个数字是二进制还是2的补码?
我正在用C语言制作一个只使用逻辑门的二进制加法器。例如,我想加上4+-5,这样我就可以得到2的补码,然后把它转换成十进制。以同样的方式,如果我这样做,4+-3我将得到二进制的答案,并希望使用相同的函数将其转换为十进制 现在,我知道如何将2的补码转换成十进制,将二进制转换成十进制。但是我想使用相同的函数将2的补码和二进制转换为十进制。要做到这一点,我必须弄清楚这个数字是二进制的还是2的补码。这就是我被困的地方 有人能给我一个想法,算法或C代码来找出一个数字是2的补码还是普通二进制 源代码 筹码 Ourhdr.h 主程序设计 从用户处读取两个数字n1和n2 获取指向数组的指针位s1和位s2,该数组的位为n1和n2。请注意,数组的顺序将相反,即最后一位将位于数组的第0个变量中。 设置一个for循环,在该循环中,您将传递三个变量,即,要添加的位和最后一次位添加操作的进位。 返回值将是三位相加的结果,进位将更改为加法后的进位(如果有)。通过1和0,进位为1,因此,返回值将为0,进位将再次更改为1。 返回值将存储在另一个名为sum的数组中。 数组和将使用我上面给出的函数转换为int。 这就是我被困的地方。我现在想把整数改成十进制数。但要做到这一点,我必须知道它是以2的恭维数的形式出现,还是仅仅是一个普通的二进制数。我不知道怎么做。如何在C中检查一个数字是二进制还是2的补码?,c,binary,complement,C,Binary,Complement,我正在用C语言制作一个只使用逻辑门的二进制加法器。例如,我想加上4+-5,这样我就可以得到2的补码,然后把它转换成十进制。以同样的方式,如果我这样做,4+-3我将得到二进制的答案,并希望使用相同的函数将其转换为十进制 现在,我知道如何将2的补码转换成十进制,将二进制转换成十进制。但是我想使用相同的函数将2的补码和二进制转换为十进制。要做到这一点,我必须弄清楚这个数字是二进制的还是2的补码。这就是我被困的地方 有人能给我一个想法,算法或C代码来找出一个数字是2的补码还是普通二进制 源代码 筹码 O
注意:NAND2TTERIS项目是用hdl完成的,但我熟悉用C完成它。此外,我上面提到的许多函数都是从stackoverflow获得的。虽然,这个设计是我自己的 两者都是二进制的。差分是有符号的还是无符号的。对于>0,这是相同的。关于2s补码的有趣事实-它被如此广泛使用的原因是: 此外,你不需要知道它是消极的还是积极的。只需添加为未签名 减法与此类似,但必须对第二个操作数求反,请参见下文 你唯一需要关心的是溢出。为此,您必须检查结果的符号是否实际上可以由两个输入的符号和从最前面到最重要位的加法溢出产生 int n的求反是由0-n简单地完成的。或者,您可以将所有位反转并加1——这就是CPU或硬件减法器的基本功能 请注意,2的补码二进制文件具有不对称范围:-N+1。。。N
对于转换,只需检查最小值必须单独处理并直接输出,否则,如果n<0,则获取符号,并对值n=-n求反,最后将-然后无符号/正-值转换为字符串或字符流。我不明白。2的补码是二进制的。那么如何在C语言中使用逻辑门呢?@unwind,您只需模拟逻辑门。这是因为制作电路需要很多时间,而且很难。我还是不明白你的意思。我相信答案是否定的,除非你想添加一个额外的位来保存这些信息,否则这是不可能的。二进制只是一些基本的东西:1和0的原始集合。计算机不知道这些1和0代表什么:它可能是一个有符号的数字,也可能是一只猫的图片。程序员的工作是编写一个程序,告诉计算机如何处理二进制文件。相反的做法是没有意义的。你不能让计算机告诉你你的程序应该做什么。@AshishAhuja:2s补码——因为计算机中的任何其他值都是二进制的。没有多少二进制代码。今天的计算机都是二进制的。任何值表示都只是一种编码。对于unsigned,除了简单的2**n表示之外,还有其他编码。还有其他各种表示法使用MSB作为符号,但不是2的补码。和一个正数设置。。。这是不可能的。因为这样编码就不再表示正数了。如果操作OTOH会错误地更改该位,则会产生溢出。在C语言中,有符号整数的溢出是未定义的行为-不需要进一步研究。是的。但与这里的问题无关。否则,对于一个明显的初学者来说,这将是非常复杂的。一个像OP这样的项目的初学者必须了解这些事实。如果他不明白,他应该先备份并掌握基本知识。无论如何,答案应该是正确的,并且使用正确的术语。注意,这不仅由OP读取。要检测有符号整数是否为负,只需将其与0进行比较。
你可以自由地提供一个更适合教育的答案。提问者很明显该怎么处理这些信息:只使用逻辑门你说的不对称是什么意思?嗯,我明白了。现在我已经在问题中发布了代码。这是否足以使其可读性和可理解性?另外,我刚刚注意到你分开打错了。你能为将来的观众编辑一下吗?谢谢,编辑好了。下次你可以自己更正这些错误。只是一个提示:对全加器和半加器做一些研究。这些是典型的逻辑构建块,由几个门组成,这些门添加两个位,用于级联任意位宽度。还搜索串行加法器。这些来自硬件开发。也有与这些功能74XXyy TTL逻辑系列芯片可用。不,我不能。由于最小编辑限制为6个字符,并且没有其他需要更正的内容,我只能与您联系。这篇文章的作者。@AshishAhuja:有一个技巧:如果你剪切/粘贴相同的文本,系统不会注意到-
// Author: Ashish Ahuja
// Date created: 8-1-2016
// Descriptions: This file stores all the chips for
// the nand2tetris project.
// Links: www.nand2tetris.org
// class.coursera.org/nand2tetris1-001
// Files needed to compile successfully: ourhdr.h
int not (unsigned int a) {
if (a == 1) {
return 0;
}
else if (a == 0) {
return 1;
}
}
int and (unsigned int a, unsigned int b) {
if (a == 1 && b == 1)
return 1;
else if ((a == 1 && b == 0) || (a == 0 && b == 1) || (a == 0 && b == 0))
return 0;
}
int nand (unsigned int a, unsigned int b) {
unsigned int ans = 10;
ans = and (a, b);
unsigned int ack = not (ans);
return ack;
}
int or (unsigned int a, unsigned int b) {
return (nand (not (a), not (b)));
}
int nor (unsigned int a, unsigned int b) {
return (not (or (a, b)));
}
int xor (unsigned int a, unsigned int b) {
unsigned int a_r;
unsigned int b_r;
unsigned int sra;
unsigned int srb;
a_r = not (a);
b_r = not (b);
sra = nand (a_r, b);
srb = nand (b_r, a);
return nand (sra, srb);
}
int xnor (unsigned int a, unsigned int b) {
return (not (xor (a,b)));
}
include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <signal.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <math.h>
#include <time.h>
#include <stdbool.h>
#include <termios.h>
#include <stddef.h>
#include <sys/types.h>
#include <my/signal.h>
#include <my/socket.h>
#include <my/io.h>
#include <my/lib.h>
#include <my/tree.h>
#include <my/bits.h>
#include <my/binary.h>
//#include <my/error.h>
#define MAXLINE 4096
#define BUFF_SIZE 1024
int array_num (int arr [], int n) {
char str [6] [2];
int i;
char number [13] = {'\n'};
for (i = 0; i < n; i ++)
sprintf (str [i], "%d", arr [i]);
for (i = 0; i < n; i ++)
strcat (number, str [i]);
i = atoi (number);
return i;
}
int *get_bits (int n, int bitswanted) {
int *bits = malloc (sizeof (int) * bitswanted);
int k;
int mask;
int masked_n;
int thebit;
for (k = 0; k < bitswanted; k ++) {
mask = 1 << k;
masked_n = n & mask;
thebit = masked_n >> k;
bits [k] = thebit;
}
return bits;
}
int convert_num (int n, int what) {
int rem;
int i;
int binary = 0;
int decimal = 0;
switch (what) {
case 0: // Convert decimal to binary
i = 0;
rem = 0;
while (n != 0) {
rem = n % 2;
n /= 2;
binary += rem * i;
i *= 10;
}
return binary;
break;
case 1: // Convert binary to decimal
i = 0;
rem = 0;
while (n != 0) {
rem = n % 10;
n /= 10;
decimal += rem*pow (2, i);
i ++;
}
return decimal;
break;
}
}