我知道MSB,LSB,符号和幅度一和二的补码等。现在,我想知道我是否正在编写和编程做一些位操作,我如何检查内存中的实际位级数据?
即。 int a = -1;
我如何知道4位表示中是1001
还是1110
还是1111
?
如何找出我的实现用于表示负数的方法?
我正在寻找一些方法来检查C程序的位级数据。
我目前的平台是Ubuntu 12.04 LTS。再一次,问题不在于如何完成。它是关于如何找出或证明它以某种方式完成。
答案 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;
}
答案 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