负数如何存储在内存中?如何知道位表示?

时间:2012-06-20 19:19:09

标签: c binary bit-manipulation bit

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

即。 int a = -1;我如何知道4位表示中是1001还是1110还是1111

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

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

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

8 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

(gdb) p/t var

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

答案 3 :(得分: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上看到它。

答案 4 :(得分:1)

在C中,负数用2的签名数字表示。

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

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

答案 5 :(得分: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

答案 6 :(得分: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

答案 7 :(得分: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