关于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
- 关于char强制转换成int到底是用0还是用1补位的猜想与检验
- 关于void*与int的强制转换
- 用strcat()时,参数是int的整形变量,如何转换成char *
- MySQL数据库表的主键到底是用GUID好,还是INT好?
- char和unsigned char强制转换成int后的差异
- char和unsigned char强制转换成int后的差异
- C#将int型数字转换成3位字符串,不足的时候,前面补0
- 如何判断Int型值的第nbit位是否是1还是0
- char数组与string的强制转换
- char型变量强制转换成int时
- int 与 byte 的强制类型转换
- char与int等数据类型的强制转化
- char与int等数据类型的强制转化
- POJ2139-有关%.0lf与(int)强制类型转换的区别,用Dijkstra写的单源点最短路径
- CSting与char int sting的转换
- int与char之间的转换关系
- int 与char数组之间的转换
- char与int型的相互转换
- 系统管理员须知,抵御Petya你行的!
- 独家专访 | 稀土掘金90后创始人阴明:最新融资2000万、估值1.3亿背后的技术社区
- 深度 | 硅谷是如何推动编程教育的?
- Python基础二(输入与输出)
- 数学基础
- 关于char强制转换成int到底是用0还是用1补位的猜想与检验
- SVD分解
- 微博整改:上传视频不得超过15分钟
- “奖学金” 中结构体和排序
- “教材涉黄”案水落石出 网址早过期出版社不知情
- 瑞星:Petya勒索病毒全球爆发 目前已影响到中国
- 突发奇想来揣测揣测大师是如何发明补码的
- Entity Framework入门(1)---简介
- VLC 播放PCM音频文件