在以下程序中,我将初始化为,将其设置为 255
因此,在Binary中,我们有:

0000 0000 1111 1111

那是十六进制的:

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");

}

因此,当我将的地址存储在 cptr 中时,它应指向低位字节(假设Little Endian,这是我的系统拥有的功能)。

因此, * cptr 包含1111 1111。这应该降至-127。因为, 1 位是符号位。

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

请解释我要去哪里错了?

最佳答案

您从哪里得知1111 1111-127?显然,您假设应该独立于其余位来解释“符号位”,即以+127的二进制表示形式设置符号位应将其转换为-127,对吗?好吧,确实存在以这种方式工作的表示形式:它被称为签名幅度表示形式。但是,实际上它实际上是未使用的。大多数现代机器将2's Complement表示形式用于带符号的类型,这是完全不同的事情。

在2补码机上,1111 1111一直是-1-127将是1000 00011000 0000-128,顺便说一句。

最重要的是,请记住char类型不一定是带符号的。如果您特别需要带符号的类型,则必须将其拼写出来:signed char

关于c++ - 我似乎不了解有关将整数指针转换为字符指针的程序输出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3659285/

10-11 19:13