3

我知道 MSB、LSB、符号和幅度 1 和 2 的补码等。现在,我想知道我是否正在编写和编程进行一些位操作,我将如何检查内存中的实际位级数据?

int a = -1;我怎么知道它是4 位表示1001还是411101111表示?

如何找出我的实现用来表示负数的方法?

我正在寻找某种方法来检查 C 程序的位级数据。

我当前的平台是 Ubuntu 12.04 LTS。再一次,问题不在于它是如何完成的。它是关于如何找出或证明它是以某种方式完成的。

4

8 回答 8

3
union { int i; unsigned u; } x;
x.i = -1;

现在x.u为您提供具有相同位的无符号整数。只有一种方法可以表示无符号数,因此您可以检查它。(作为提示:它很可能是二进制补码。)

printf("%x\n", x.u);

上面的打印语句将打印出无符号整数的十六进制表示,您可以使用它来确定位。

于 2012-06-20T19:25:02.503 回答
1
void showBit(int num, int nBit)//nBit -> number of bits
{
    unsigned int temp = 1<<(nBit-1), i;

    for(i=0; i<nBit; ++i)
    {
        printf("%d ", ((num&temp)?1:0) );
        temp = temp>>1;
    }
    printf("\n");
}  

您可以使用此函数打印二进制表示。在ideone上看到。

于 2012-06-20T19:33:08.287 回答
1

在 C 中,负数以 2 的补码格式表示有符号数。

这样做是为了避免任何编译器(我,即使 int 是 8 位或 16 位或 32 位等它也可以工作)。

在您的情况下,如果您的编译器将 int 解释为 8 位,则 1111 1111 将被存储。只要第一位(符号位)为 1,编译器就会理解它是一个负数,并且理解该数字必须是两者的互补。这不过是 0000 0001,带有负号

于 2014-02-18T11:06:05.583 回答
1

通过应用按位运算。例如,您可以通过执行测试是否设置了第 n 位a & (1<<n)(循环应用它,然后您得到整数)。

编辑:但这仅在内部表示为二进制时才有效。当使用不同的系统(例如,俄罗斯人在 70 年代拥有具有三进制逻辑和数字系统的计算机,而波兰人使用负二进制系统)时,这不会给出正确的内部使用格式。

于 2012-06-20T19:25:48.830 回答
1

一种简单的方法是在调试器中检查变量,如下所示:

(gdb) p/t var

p/t说打印二进制表示。

于 2012-06-20T19:26:53.517 回答
0

你甚至可以使用union

union num
{
    int f;
    char c[4];
};

void printBinary(union num u)
{
    int i,t,j;

    for(i=sizeof(u)-1; i>=0; i--)
    {
            for(j=0,t=128; j<8; j++,t>>=1)
                    printf("%d",(u.c[i]&t)?1:0);
            printf(" ");
    }
}

int main() 
{
    union num n;
    n.f=10;
    printBinary(n);
    return 0;
}

见这里:http: //ideone.com/i9YCt

于 2012-06-20T20:12:00.653 回答
0

如何找出我的实现用来表示负数的方法?

方法如下:

unsigned int a = -1;
swicth (a & 3U)
{
    case 3:
        printf("two's complement\n");
        break;

    case 2:
        printf("one's complement\n");
        break;

    case 1:
        printf("sign and magnitude\n");
        break;

    default:
        printf("compiler broken\n");
        break; 
}

最终答案实际上在您的编译器文档中,需要记录使用哪种签名表示。例如,对于gcc

有符号整数类型是使用符号和大小、二进制补码还是一个补码表示,以及异常值是陷阱表示还是普通值 (C99 6.2.6.2)

GCC 只支持二进制补码整数类型,所有位模式都是普通值

http://gcc.gnu.org/onlinedocs/gcc/Integers-implementation.html

于 2012-06-20T21:16:28.207 回答
0

由数字的第 8 位标识的正数和负数。如果第 8 位为 0,则为正,否则为负。

For example x=8
so In binary x=8=0000 1000 (It is positive number, so eight bit is 0 from right to left)

For negative x = -8
The negative numbers are represented in binary using 2's complement usually.
 so x = -8 

step 1 binary of        8 = 0000 1000
step 2 1's complement     = 1111 0111
step 3 2's complement     =         1
                         y = 1111 1000 =248(so it represents the negative because 8th bit is 1 then it follows the below formula)

The formula for getting negative value from binary representation is 2^8-y
 so 256-248=8
于 2017-02-21T14:29:07.720 回答