C++ 我不知道';我似乎不理解这个程序关于整数指针到字符指针转换的输出
在下面的程序中,我将i初始化为255 因此,在二进制中,我们有: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的地址存
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的地址存储在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");
}