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

Sad*_*que 2 c c++

在下面的程序我initiliaze 255 因此,在二进制,我们有:

0000 0000 1111 1111
Run Code Online (Sandbox Code Playgroud)

这是在十六进制:

0X 0 0 f f

因此根据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");

}
Run Code Online (Sandbox Code Playgroud)

所以,当我的地址存储CPTR应该指向低字节(假设小端,怎么这是我的系统了).

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

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

请解释我哪里出错了?

AnT*_*AnT 8

你在哪里得到的想法1111 1111-127什么?显然,你假设"符号位"应该独立于其余位解释,即设置二进制表示的符号位+127应该将其转换为-127,对吗?那么,以这种方式工作的表示确实存在:它被称为Signed Magnitude表示.但是,它在实践中几乎未被使用.大多数现代机器都使用2的补码表示来表示签名类型,这是完全不同的事情.

1111 1111一直是2的补充机器-1.-127会的1000 0001.而且1000 0000-128,BTW.

最重要的是,请记住,char类型不一定是签名.如果你特别需要签名类型,你必须拼写出来:signed char.