c语言char数字转int补位,关于char强制转换成int到底是用0还是用1补位的猜想与检验...
关于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<
for(i=1;i<=n;i++)
{
putchar(!(x&mask)?'0':'1');
x<<=1;
if(!(i%CHAR_BIT)&&i
{
putchar(' ');
}
}
}
void InPrintBit(int x)//用于输出int型在内存中的二进制保存值
{
int i=0;
int n=sizeof(int)*CHAR_BIT;
int mask =1<
for(i=1;i<=n;i++)
{
putchar(!(x&mask)?'0':'1');
x<<=1;
if(!(i%CHAR_BIT)&&i
{
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
c语言char数字转int补位,关于char强制转换成int到底是用0还是用1补位的猜想与检验...相关推荐
- java float强制转换int类型_float型怎样强制转换成int型
展开全部 运行时所有数据都存储在内存中,32313133353236313431303231363533e4b893e5b19e31333436316236所以相同很正常,float转int会将小数后 ...
- C# 扩展object类 将string强制转换成int
扩展代码: public static class ClassExtend{/// <summary>/// 将object强制转化为int/// </summary>/// ...
- 把object强制转换成int
Map.Entry entry =(Map.Entry)it.next(); Object val=entry.getValue(); int i = ((Integ ...
- c语言如何float转换到uint,float转为int sql中float怎样转成int
C语言中float型转换成int型是什么规则 float型前24位是小数部分,后8位是指数部分.整型是16位,那是怎么转换C语言整型使用原码.反码.补码进行编码,而浮点型使用IEEE754进行编码,所 ...
- 如何把char类型的数字字符转换成int类型
近来面试遇到一个问题,通过控制台输入一个12位的数字,然后进行一些计算,然后被困在如何把char类型的数字转换成int类型.通过搜索,找到两个解决办法. 1.把char型转换成int类型 for(in ...
- 把字符串转换成int整数
题目描述 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 数值为0或者字符串不是一个合法的数值则返回0 输入描述: 输入一个字符串,包括数字字母符号,可以为空 输出描述: 如果是合法 ...
- java如何将char类型的数字转换成int型的数字
java如何将char类型的数字转换成int型的数字 public class CharToIntConverter {public static void main(String[] args) { ...
- 打印不同对象的字节表示 ( 对int*强制转换成unsigned char*的理解 )
此文章参考<深入理解计算机系统>P31. 先看如下代码: 12345的十六进制表示为:0x00003039 1 #include <stdio.h> 2 3 int main ...
- java 把char转换成int型,java如何把char型数据转换成int型数据(转)
一字符串,String="2324234535": 把第i个数取出来时是char型的:char temp=String.charAt(i) 如何把char型转换成int型? 我需要 ...
最新文章
- centos6查看java命令_linux 常用命令(五)——(centos7-centos6.8)JDK安装
- Aspx页面内 成员变量丢失的问题
- 【转】64位ORACLE客户端上plsql无法识别ORACLE_HOME解决方案
- 【转】 jquery遍历json数组方法
- VMware Fusion中使用迅雷的问题
- access数据库应用系统客观题_Access数据库程序设计模拟题
- 计算机课怎样制作ppt 课件,如何制作PPT课件视频
- python哪里下载-python从哪下载
- 读django文档——nginx + uwsgi 部署django项目
- Zookeeper实现注册中心
- 多线程同步有几种实现方法C语言,线程同步与并发
- 开关电源保险丝、整流桥及输入滤波电容的选型
- 数据可视化之设计经验分享:轻松三步教你学会制作数据可视化大屏思路
- 闪电贷攻击又背锅? “幕后元凶”竟是它!
- UC浏览器怎样收藏视频?UC浏览器收藏视频的方法
- 通过ch.ethz.ssh2.Connection无法连接主机解决方法
- Oracle开发实战学习
- 同桌之间那些或暧昧或有趣的事
- 上海之旅,再让键盘长几天草
- Angelababy否认已怀身孕:我怎么不知道