关于char强制转换成int到底是用0还是用1补位的猜想与检验

来源:互联网 发布:splice js参数 编辑:程序博客网 时间:2024/05/20 13:19

关于char强制转换成int到底是用0还是用1补位的猜想与检验

 最近学C语言发现char强制转换时值会完全不同,而且变化很大,于是决定写代码测试一下。

先检验一下char型的-3和3在内存中分别怎么表示

——用到的函数

void PrintBit(char x)//用于输出char型在内存中的二进制保存值{    int i=0;    int n=sizeof(char)*CHAR_BIT;    int mask =1<<(n-1);    for(i=1;i<=n;i++)    {        putchar(!(x&mask)?'0':'1');        x<<=1;        if(!(i%CHAR_BIT)&&i<n)        {            putchar(' ');        }    }}void InPrintBit(int x)//用于输出int型在内存中的二进制保存值{    int i=0;    int n=sizeof(int)*CHAR_BIT;    int mask =1<<(n-1);    for(i=1;i<=n;i++)    {        putchar(!(x&mask)?'0':'1');        x<<=1;        if(!(i%CHAR_BIT)&&i<n)        {            putchar(' ');        }    }}

——输出的方式以及结果

char a=-3,b=3;  PrintBit(a);//输出char a的二进制码printf("\n");InPrintBit((int)a);//输出int a的二进制码printf("\n");PrintBit(b);//输出char b的二进制码printf("\n");InPrintBit((int)b); //输出int b的二进制码

从中发现可能负数前面补1正数前面补0,于是我猜想可能与强制转换的类型有关。

——中途发现一件很神奇的事情
unsigned char a=-3是可以定义的,而且可以保存,并不报错,明明说unsigned char不能表示负数的。
——更加神奇的是InPrintBit((int)a);再次输出a时前面竟然补0了。

百度上说了这么一句话——无论是强制转换或是自动转换,都只是为了本次运算的需要而对变量的数据长度进行的临时性转换,而不改变数据说明时对该变量定义的类型。
也就是说可能 编译器运行的时候只是对变量进行拷贝,就像java中的一样,并不是直接用原数据进行计算。
换句话说——他只是把原数据提出来,然后按照想要的进行补位,如果原来的定义是unsigned,那么默认他就是无符号的,转换成unsigned int 的时候就会补0。
——验证猜想

    unsigned char a=-3;    InPrintBit((int)a);

——再多变几次

unsigned char a=-3;InPrintBit((int)a);printf("\n");PrintBit((char)((int)a));//由unsigned char 变成int再变回char printf("\n");PrintBit(a);


毫无影响原来的值。

——最终猜想,值一直都是那个值,变化是根据原来的值的类型名来进行的变化。
——最终验证

char a=-3;printf("\n");InPrintBit((unsigned int)((unsigned short int)a));  

总结

由最终验证明显可以看出,强制类型转换补0还是补1取决于原来变量的名字以及自身的值。

比如原本的char a=-3,自身是1111_1101如果此时把他转换成unsigned short int,他补的就是1,如果转换成unsigned short int再进一步转换成unsigned int,他补的就是0。
如果之前是unsigned char a=-3,他竟然可以通过编译不报错,再次转换的时候编译器直接根据之前的unsigned判定他就是正数,于是直接补0。

写在最后

本文毫无科学依据,只有实验依据,如有误,敬请批评指正。邮箱644360964@qq.com

阅读全文
0 0
原创粉丝点击