说在前面:是一个C语言新手,很新的新手,在这个专栏记录一些探索过程
今天学习中学到类型转换,将int和short类型赋值给char类型变量时,因为想要清楚看到隐式转换的结果,产生了写一个东西来输出数据在计算机中的二进制存储形式的想法,以下为尝试过程
一、首先想到的是利用上次尝试写的”使用位运算符输出十进制数的二进制表示“,写一个函数,如下:
//定义一个转二进制函数
void binary(int n)
{
int y;
y=n>>31&1;
if(y==1) //对负值进行处理
{
printf("-");
n=-n; //负值以补码形式存储,不便于直接移位得到二进制数
}
int i,m=0;
for(i=30;m==0;i--) //去掉前面大串多余的0 相较于10.7优化:直接使用i来控制循环
{
m=n>>i&1;
}
for(i=i+1;i>=0;i--) printf("%d",n>>i&1);
n=-n;
printf("\n"); //换行
}
使用该函数展示隐式转换结果:
//隐式类型转换:将整形赋值给字符型
int main()
{
char ch = 555;
printf("%c\n",ch);
printf("%d\n",ch);
binary(ch); //101011
binary(555); //1000101011
//只将整形的后八位存储到了浮点型中,其余部分舍弃
return 0;
}
可以看到使用这种方法是可以表示出来整形555和字符ch是不同的,但并不能表示出完整的二进制存储格式,仍然不够直观
二:考虑使用sizeof得到数据所占内存,进而用相似方式得到二进制存储格式
但是由于函数的参数要求确定数据类型,而我们此处的对象数据类型是不确定的,所以不再使用函数
三:于是简单的学习了一下宏变量,并考虑用宏变量实现目的,如下:
#define STORAGE(n){\
int a=sizeof(n);\
for(a=8*a-1;a>=0;a--){\
int b=n>>a&1;\
printf("%d",b);\
}\
printf("\n");\
}\
接下来再使用该宏名输出二进制存储格式:
//隐式类型转换:将整形赋值给字符型
int main()
{
char ch = 555;
printf("%c\n",ch);
printf("%d\n",ch);
binary(ch); //101011
binary(555); //1000101011
STORAGE(ch); //00101011
STORAGE(555); //00000000000000000000001000101011
//只将整形的后八位存储到了浮点型中,其余部分舍弃
return 0;
}
可以看到此时的输出结果即为数据的二进制存储格式,可以清楚的看出将int赋值给char的隐式转换结果,目的达成