繁体   English   中英

我似乎不理解该程序关于将整数指针转换为字符指针的输出

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM