整形之间的强制转换

在强制类型转换中,我们常用的整形强制转换有无符号和有符号类型的强制转换。所以首先我们得介绍一下计算机中存储数字的方式,计算机中通常以补码的形式来存储数据,以8位数据为例,二进制与有符号数的对应关系为:

0 1 2 127 -128 -127 -1
0000 0000 0000 0001 0000 0010 0111 1111 1000 0000 1000 0001 1111 1111

无符号转有符号

0 1 2 127 128 129 255
0000 0000 0000 0001 0000 0010 0111 1111 1000 0000 1000 0001 1111 1111

所以对于有符号数,首先最高位是正负的标志位。要将无符号数强制转化为有符号数时,其内存上的二进制是不会改变的,只是我们对它的解释变了,即无符号数128强制转化有符号数即-128。

当然这样引申出来的一种好处就是对于有符号数的判断,如

char a;
...
if((a>=0)&&(a<80))
{....
}

可以使用强制转化,省去一个判断条件

char a;
...
if( ((unsigned char)a) < 80)
{....
}

有符号转无符号

将有符号数变成无符号数时,情况也类似,如8位的有符号数120转无符号也是120,但8位的-1转无符号则为255。所以当我们在有符号数的计算中,想保留大于等于0的数,不能通过强制转化来完成,必须得加判断:

char a,b,d;
unsigned char c;
....
c=(unsigned char)(a+b);  (×):当运算结果小于0时c会异常,变成超级大数d=a+b;
c = (d<0)?0:d;           (√)

不同长度数字转化中的截断

比如我有一个8位的有符号数-1,要转换为一个16位的有符号数,那么结果仍旧是-1。首先我们要明确一点,那就是虽然8位的有符号数-1的二进制原本1111 1111,但载入32位的cpu中运算时,它将转化为32位的有符号数进行运算,即int类型的-1。所以对于char类型的数据,即使运算结果超过了该类型,其实也不会发生异常:

char a=127,b=127,c=127,e;
int d;
....
e=a+b+c;      (×):当运算结果超过存储类型的表示范围时,会因截断产生错误
d=a+b+c;     (√):32位的int类型足够存储结果。

所以我们如果把不同长度的数字进行类型转换,只有两个步骤:

1、将该数表示为32位
2、将32位数截断为结果类型

不过,可以确定的一点就是,进行第一步时,数的值不会发生变化:

比如8位有符号数-1(1111 1111)将转化为32位的-1(1111 1111 1111 1111 … 1111 111)。
而8位的无符号数255(1111 1111)转为32位时,也仍旧是255:(0000 0000…0000 0000 1111 111)。

但进行第二步转换时,值会由于截断而发生变化,而这个截断一般是高位截断(舍弃高位,保留低位):

如int类型的255(0000 0000 … 0000 0000 1111 1111)转化为8为的unsigned char类型时,前面的0将被截断,只保留低8位,即255(1111 1111),当然,若是转为8为的有符号char类型,则为-1(1111 1111)。截断是二进制层面的位数截断
,与实际值无关。

整形与浮点数的强制类型转换

我们都知道浮点数float类型一般遵循ieee754标准,有符号位,阶码和尾数:

与整形相同,符号位是1时代表负数,是0则为正数。而阶码代表小数点在哪儿,类似于科学计数法100会被表示为 1.0 × 10^2。详细的这里不介绍了,我们重点放在强制转化上:
对于一个int类型的数,只要在浮点数的表示范围内,便可以正确的转为浮点数格式。
但是对于一个浮点类型的数,在转化为整形时,则会只保留整数位,如:

int a= (int)0.1;    即a=0
int a= (int)1.1;    即a=1
int a= (int)1.5;    即a=1
int a= (int)-1.5;   即a=-1

所以如果要四舍五入之类的的,则不能靠强制转换,得用相关的函数。当然若是转为其他整形,则结果将有32位的整形结果进行截断得到。

当然,强制转换和 floor 这个函数的功能其实很像,floor函数的功能是向下取整:

int a= floorf(0.1);    即a=0
int a= floorf(1.1);    即a=1
int a= floorf(1.5);    即a=1

对于大于0的浮点数,他俩其实可以替换,而当小于0时,他俩区别很大:

int a= floorf(-0.1);    即a=-1
int a= floorf(-1.1);    即a=-2int a=(int)-0.1;        即a=0
int a=(int)-1.1;        即a=-1

强制转化的结果,会产生正负0这种概念,如-0.9到0.9强制转化结果都为0。使用强制转化时会产生越界输出

c语言强制类型转换详解相关推荐

  1. C语言自动类型转换和强制类型转换详解,C语言强制类型转换 - 地狱的烈火的个人页面 - OSCHINA - 中文开源技术交流社区...

    C语言中的类型转换 C语言中的类型转换有两种,自动与强制. 它们都有几种情况,如不同长度的转换:不同类型的转换:还有无符号与有符号数之间的转换.关键是两点,即长度不同时如何转换,在有无符号数参与时如何 ...

  2. C语言数据类型转换详解

    数据类型转换就是将数据(变量.数值.表达式的结果等)从一种类型转换为另一种类型. 自动类型转换 自动类型转换就是编译器默默地.隐式地.偷偷地进行的数据类型转换,这种转换不需要程序员干预,会自动发生. ...

  3. linux 强制类型转换,C++ 新标准下的强制类型转换详解

    使用标准C++的类型转换符:static_cast.dynamic_cast.reinterpret_cast和const_cast. static_cast 用法:static_cast (expr ...

  4. javascript中强制类型转换详解+总结

    javascript中一共有六种类型:Number,String,Boolean,Undefined,Object,function.可以用typeof来查看声明的变量的类型.注意,typeof是操作 ...

  5. C语言再学习 -- 详解C++/C 面试题 2

    (经典)C语言测试:想成为嵌入式程序员应知道的0x10个基本问题. 参看:嵌入式程序员面试问题集锦 1.用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #define ...

  6. C语言学习——运算符详解

    C语言学习--运算符详解 一.学习运算符 (1)运算对象的数目 C语言中,运算符的运算对象可以是一个,称单目运算符:运算对象也可以是两个,称双目运算符:运算对象还可以是三个,称三目运算符. (2)运算 ...

  7. 【C语言】操作符详解(超详细)

    hello~~,我是~小鹿,超级详细的操作符讲解来康康吧 可以收藏随时找到这里哦~ [C语言]操作符详解(超详细) 1.算数操作符:+,-,*,/,% 2.位移操作符:<< , >& ...

  8. python自动解析json_Python语言解析JSON详解

    本文主要向大家介绍了Python语言解析JSON详解,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. JSON 函数使用 JSON 函数需要导入 json 库:import jso ...

  9. (转)C语言位运算详解

    地址:http://www.cnblogs.com/911/archive/2008/05/20/1203477.html C语言位运算详解 作者:911 说明:本文参考了http://www2.ts ...

最新文章

  1. Java VS .NET:Java与.NET的特点对比
  2. 有人喜欢爱情测试小游戏么
  3. 剑指offer面试题27:二叉搜索树与双向链表
  4. java中ftp删除文件,Java 实现ftp 文件上传、下载和删除
  5. java字符动画思路_【轻松一刻】Java制作字符动画
  6. C# CSV文件读取(带换行单元格中内容处理)
  7. eos节点服务器_EOS跌落神坛?
  8. Java 信号 Semaphore 简介
  9. Pentium 4处理器架构/微架构/流水线 (3) - NetBurst微架构
  10. java北大oj1001_这个——北大 ACM POJ 1001 Exponentiation C/C++
  11. java转换字符集_Java字符集转换解释
  12. RetinaNet算法详解及其在垃圾检测中的应用
  13. 转载Prince_vegeta制作的VC知识库1-53期合订本索引文件。
  14. Android Studio基于360加固的一键加固gradle脚本配置
  15. 永中office之在线预览(vue/js版)
  16. android点击特效,android 点击特效动画
  17. Vue keep-alive和activated的用法
  18. google 文档翻译 html,快速将整篇中文文档翻译成全英文(史上最全总结)
  19. 图神经网络笔记(二)——卷积图神经网络概述
  20. 多御安全浏览器安卓版迎来重大更新:新增分享二维码功能

热门文章

  1. 大数据24小时:商汤再融6亿美元;彭蕾卸任蚂蚁金服;今日头条等APP下架
  2. Java-BufferedImage动态生成一个表格图片
  3. NBA球星来华 打短工还是掠夺性开发?
  4. 我的梦想是当一个计算机英语,my dream(我的梦想)英语作文带翻译
  5. iPhone屏幕适配常用宏
  6. 谈一谈类似TT语音,比心陪练,猎游app,皮皮约玩,鱼泡泡,刀锋电竞这类电竞陪玩或游戏陪玩约聊APP系统的产品思考
  7. ###用户信息的修改及用户的认证信息###
  8. 张适时千元级的手机测评笔记
  9. python实现全屏爱心雨向喜欢的人表白
  10. 实战:本地存储-2022.3.1(更新版)