我知道 MSB、LSB、符号和幅度 1 和 2 的补码等。现在,我想知道我是否正在编写和编程进行一些位操作,我将如何检查内存中的实际位级数据?
即int a = -1;
我怎么知道它是4 位表示1001
还是41110
位1111
表示?
如何找出我的实现用来表示负数的方法?
我正在寻找某种方法来检查 C 程序的位级数据。
我当前的平台是 Ubuntu 12.04 LTS。再一次,问题不在于它是如何完成的。它是关于如何找出或证明它是以某种方式完成的。
我知道 MSB、LSB、符号和幅度 1 和 2 的补码等。现在,我想知道我是否正在编写和编程进行一些位操作,我将如何检查内存中的实际位级数据?
即int a = -1;
我怎么知道它是4 位表示1001
还是41110
位1111
表示?
如何找出我的实现用来表示负数的方法?
我正在寻找某种方法来检查 C 程序的位级数据。
我当前的平台是 Ubuntu 12.04 LTS。再一次,问题不在于它是如何完成的。它是关于如何找出或证明它是以某种方式完成的。
union { int i; unsigned u; } x;
x.i = -1;
现在x.u
为您提供具有相同位的无符号整数。只有一种方法可以表示无符号数,因此您可以检查它。(作为提示:它很可能是二进制补码。)
printf("%x\n", x.u);
上面的打印语句将打印出无符号整数的十六进制表示,您可以使用它来确定位。
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上看到。
在 C 中,负数以 2 的补码格式表示有符号数。
这样做是为了避免任何编译器(我,即使 int 是 8 位或 16 位或 32 位等它也可以工作)。
在您的情况下,如果您的编译器将 int 解释为 8 位,则 1111 1111 将被存储。只要第一位(符号位)为 1,编译器就会理解它是一个负数,并且理解该数字必须是两者的互补。这不过是 0000 0001,带有负号
通过应用按位运算。例如,您可以通过执行测试是否设置了第 n 位a & (1<<n)
(循环应用它,然后您得到整数)。
编辑:但这仅在内部表示为二进制时才有效。当使用不同的系统(例如,俄罗斯人在 70 年代拥有具有三进制逻辑和数字系统的计算机,而波兰人使用负二进制系统)时,这不会给出正确的内部使用格式。
一种简单的方法是在调试器中检查变量,如下所示:
(gdb) p/t var
p/t
说打印二进制表示。
你甚至可以使用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
如何找出我的实现用来表示负数的方法?
方法如下:
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
由数字的第 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