C++ 我不知道';我似乎不理解这个程序关于整数指针到字符指针转换的输出

C++ 我不知道';我似乎不理解这个程序关于整数指针到字符指针转换的输出,c++,c,C++,C,在下面的程序中,我将i初始化为255 因此,在二进制中,我们有: 0000 0000 1111 1111 用十六进制表示: 0x0f 根据Little Endian布局: 首先存储低位字节-0xff #包括 int main() { int i=0x00ff;//我知道0xff是有效的。只是想让它更容易理解 char*cptr=(char*)&i; 如果(*(cptr)=-127) printf(“小端”); 其他的 printf(“Big-Endian”); } 因此,当我将i的地址存

在下面的程序中,我将i初始化为255 因此,在二进制中,我们有:

0000 0000 1111 1111
用十六进制表示:

0x
0f

根据Little Endian布局: 首先存储低位字节-0xff


#包括
int main()
{
int i=0x00ff;//我知道0xff是有效的。只是想让它更容易理解
char*cptr=(char*)&i;
如果(*(cptr)=-127)
printf(“小端”);
其他的
printf(“Big-Endian”);
}

因此,当我将i的地址存储在cptr中时,它应该指向较低的字节(假设是小端字节,因为我的系统就是这样)

因此,*cptr包含
1111111
。这应该降到-127。因为,1位用于符号位

但是当我打印*cptr的值时,我得到-1,为什么会这样


请解释我哪里出错了?

1111111
是一个
-1
,因为
-1
是最大的负整数。记住,在数学中,
-1
-2
更重要,因此为了方便起见,二进制表示应该具有相同的属性。所以
10000001
将代表
-127

你从哪里知道
1111111
-127
?显然,您假设“符号位”应独立于其他位进行解释,即在
+127
的二进制表示中设置符号位应将其转换为
-127
,对吗?确实存在这样一种表示法:它被称为符号量表示法。然而,它实际上在实践中未被使用。大多数现代机器使用符号类型的表示,这是完全不同的事情

在2的补码机器上,
1111111
始终是
-1
<代码>-127将是
1000 0001
。而且
1000 0000
-128
,顺便说一句


除此之外,请记住,
char
type不一定是有符号的。如果你特别需要一个有符号的类型,你必须把它拼出来:
signed char

在二进制中有三种表示负数的方法:有符号的大小、1补码和2补码

有符号的大小最容易理解:一位用于表示符号(0=+,1=-),另一位表示值的大小。
在1补码中,通过对相应的正数(切换所有位)执行逐位反转来获得负值
在两位补码中,正数和负数之间的转换方式不那么简单(翻转所有位,然后加1),但它有一些特点,使其在计算机中特别有用

因为计算机可以很好地处理两个补码表示,这就是大多数计算机用来表示整数的原因


问题是,您希望使用有符号的幅度表示法(最高位设置为负值。所有其他位设置为负值,因此值=-127),但计算机使用的是两位补码表示法(其中所有bis设置为=-1)。

显示打印
i
的行!使用交互式调试器检查内存和变量值可以极大地帮助解决此类问题。-1因为问题太模糊了。它是关于什么的,整数的二进制表示?endianess和知道设置了哪些位?“但当我打印我的值时,我得到-1”。对不起,我很难相信。显然,你的意思是“…当我打印
*cptr
的值时…”@Xaero:对我来说,你的问题的标题和文本不匹配。你看,你编辑了你的问题,因为你把我们送上了完全错误的轨道。请更加努力地提出你的问题precisely@Xaero:反向?对2的补码中的一个数字求反的规则很简单:将所有的位求反,然后加1。@Xaero:是的。你有了
-1
,它变成了
+1
,这是应该的。现在,您可以在
+1
上执行相同的操作,您将再次获得
-1
#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");

}