在以下程序中,我将初始化为,将其设置为 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 0001
。 1000 0000
是-128
,顺便说一句。
最重要的是,请记住char
类型不一定是带符号的。如果您特别需要带符号的类型,则必须将其拼写出来:signed char
。
关于c++ - 我似乎不了解有关将整数指针转换为字符指针的程序输出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3659285/