对于以下代码:
void main()
{
int i;
float a=5.2;
char *ptr;
ptr=(char *)&a;
for(i=0;i<=3;i++)
printf("%d ",*ptr++);
}
我得到 o/p 为 102 102 -90 64 ..为什么?字符指针如何处理每个字节的 MSB 位?
char 是有符号还是无符号是实现定义的。显然,系统中的 char 数据类型已签名。所以 MSB 是符号位。
如果将5.2
浮点值转换为二进制格式,则会得到:
5.2 = 01000000 (=64) 10100110 (=166) 01100110 (=102) 01100110 (= 102)
如果您取第 3 个字节 ( 166
) 并将其转换为一个signed char
值(在 内[-128, 127]
),那么您将获得-90
.
编译您的程序-funsigned-char
以获取102 102 166 64
输出。
在您的情况下,显然它将最高有效位视为符号位,换句话说,在您的实现char
中是有符号整数类型,顺便说一句,带有二进制补码表示。
在您的情况下,char
使用有符号位表示。就值而言,它们取决于您正在处理的系统的字节顺序。