关于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补位的猜想与检验...相关推荐

  1. java float强制转换int类型_float型怎样强制转换成int型

    展开全部 运行时所有数据都存储在内存中,32313133353236313431303231363533e4b893e5b19e31333436316236所以相同很正常,float转int会将小数后 ...

  2. C# 扩展object类 将string强制转换成int

    扩展代码: public static class ClassExtend{/// <summary>/// 将object强制转化为int/// </summary>/// ...

  3. 把object强制转换成int

    Map.Entry     entry =(Map.Entry)it.next();       Object        val=entry.getValue(); int i = ((Integ ...

  4. c语言如何float转换到uint,float转为int sql中float怎样转成int

    C语言中float型转换成int型是什么规则 float型前24位是小数部分,后8位是指数部分.整型是16位,那是怎么转换C语言整型使用原码.反码.补码进行编码,而浮点型使用IEEE754进行编码,所 ...

  5. 如何把char类型的数字字符转换成int类型

    近来面试遇到一个问题,通过控制台输入一个12位的数字,然后进行一些计算,然后被困在如何把char类型的数字转换成int类型.通过搜索,找到两个解决办法. 1.把char型转换成int类型 for(in ...

  6. 把字符串转换成int整数

    题目描述 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 数值为0或者字符串不是一个合法的数值则返回0 输入描述: 输入一个字符串,包括数字字母符号,可以为空 输出描述: 如果是合法 ...

  7. java如何将char类型的数字转换成int型的数字

    java如何将char类型的数字转换成int型的数字 public class CharToIntConverter {public static void main(String[] args) { ...

  8. 打印不同对象的字节表示 ( 对int*强制转换成unsigned char*的理解 )

    此文章参考<深入理解计算机系统>P31. 先看如下代码:  12345的十六进制表示为:0x00003039 1 #include <stdio.h> 2 3 int main ...

  9. java 把char转换成int型,java如何把char型数据转换成int型数据(转)

    一字符串,String="2324234535": 把第i个数取出来时是char型的:char temp=String.charAt(i) 如何把char型转换成int型? 我需要 ...

最新文章

  1. centos6查看java命令_linux 常用命令(五)——(centos7-centos6.8)JDK安装
  2. Aspx页面内 成员变量丢失的问题
  3. 【转】64位ORACLE客户端上plsql无法识别ORACLE_HOME解决方案
  4. 【转】 jquery遍历json数组方法
  5. VMware Fusion中使用迅雷的问题
  6. access数据库应用系统客观题_Access数据库程序设计模拟题
  7. 计算机课怎样制作ppt 课件,如何制作PPT课件视频
  8. python哪里下载-python从哪下载
  9. 读django文档——nginx + uwsgi 部署django项目
  10. Zookeeper实现注册中心
  11. 多线程同步有几种实现方法C语言,线程同步与并发
  12. 开关电源保险丝、整流桥及输入滤波电容的选型
  13. 数据可视化之设计经验分享:轻松三步教你学会制作数据可视化大屏思路
  14. 闪电贷攻击又背锅? “幕后元凶”竟是它!
  15. UC浏览器怎样收藏视频?UC浏览器收藏视频的方法
  16. 通过ch.ethz.ssh2.Connection无法连接主机解决方法
  17. Oracle开发实战学习
  18. 同桌之间那些或暧昧或有趣的事
  19. 上海之旅,再让键盘长几天草
  20. Angelababy否认已怀身孕:我怎么不知道

热门文章

  1. 3DSlicer11:体系结构2
  2. 从内存中加载并启动一个exe
  3. 求1+2+……+N的和
  4. android 始终显示overflow菜单
  5. win7下不能使用dnw烧写的解决办法——韦东山嵌入式Linux学习笔记05
  6. 以操作系统的角度述说线程与进程
  7. ubuntu下docker的安装及更换镜像源
  8. springboot学习笔记(七)
  9. linux查看磁盘挂载的三种方法
  10. Understanding Generative Adversarial Networks (GAN)