[英]I don't seem to understand the output of this program regarding conversion of integer pointer to character pointer
在下面的程序我initiliaze 我 255因此,在二进制,我们有:
0000 0000 1111 1111
这是在十六进制:
0x 0 0 ff
因此根据Little-Endian布局:首先存储低位字节 - 0xff 。
#include<cstdio>
int main()
{
int i=0x00ff; //I know 0xff works. Just tried to make it understable
char *cptr=(char *)&i;
if(*(cptr)==-127)
printf("Little-Endian");
else
printf("Big-Endian");
}
所以,当我我的地址存储在CPTR应该指向低字节(假设小端,怎么这是我的系统了)。
因此, * cptr包含1111 1111
。 这应该降到-127。 因为, 1位用于符号位。
但是当我打印* cptr的值时我得到-1 ,为什么会这样呢?
请解释我哪里出错了?
你在哪里知道1111 1111
是-127
? 显然,您假设“符号位”应该独立于其余位进行解释,即将符号位设置为+127
二进制表示应该将其转换为-127
,对吧? 那么,以这种方式工作的表示确实存在:它被称为Signed Magnitude表示。 但是,它在实践中几乎未被使用。 大多数现代机器使用2的补码表示来表示签名类型,这是完全不同的事情。
在二进制补码机1111 1111
一直是-1
。 -127
将是1000 0001
。 并且1000 0000
是-128
,BTW。
最重要的是要记住, char
类型不一定是签名的。 如果您特别需要签名类型,则必须拼写出来: signed char
。
1111 1111
是-1
因为-1
是最大的负整数。 请记住, -1
在数学中大于-2
,因此为方便起见,二进制表示应具有相同的属性。 因此1000 0001
将代表-127
。
有三种方法可以用二进制表示负数:有符号幅度,1补码和2补码。
有符号的幅度最容易理解:一位用于表示符号(0 = +,1 = - ),其他位表示值的大小。
在补码中,通过对相应的正数进行逐位求逆来获得负值(切换所有位)
在二进制补码中,正数和负数之间转换的方式不那么简单(翻转所有位,然后加1),但它具有一些特性,使其在计算机中特别有用。
因为计算机在二进制补码表示中运行良好,所以大多数计算机都使用它来表示整数。
出了什么问题是你期望一个有符号的幅度表示(最高位设置,所以负值。所有其他位也设置,所以值= -127),但计算机使用二进制补码表示(其中所有bis set = = -1)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.