代码如下:
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位?
答案 0 :(得分:2)
char是有符号还是无符号是实现定义的。显然,系统中的char数据类型已签名。所以MSB是符号位。
答案 1 :(得分:1)
在您的情况下,显然它将最重要的位视为符号位,换句话说,在您的实现中char
是带符号的整数类型,顺便提一下,带有两个补码表示。
答案 2 :(得分:1)
如果将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
作为输出。
答案 3 :(得分:0)
在您的情况下,char
使用带符号的位表示。就这些值而言,它们取决于您正在使用的系统的Endianness。