c/c++语言数据类型转换的方式及常见问题

近日去笔试,发现对c语言类型转换有些陌生了,速来整理下


一、知识储备

1、正、反码,补码

  • 电脑中存储的是真值(01码)的补码。为了方便。注意+0与-0的补码表示一样。
  • 最高位1表示负数,0表示负数.
  • 1000 0000+1=1000 0001
  • (-128+1=-127)魔鬼数

1、字符的取值范围,内存存储方式

1.1、unsigned char
大小:1字节,8位
存储结构:8个真值位
最大值:1111 1111,2^7=128
最小值:0000 0000,2^0=0
取值范围:0 ~ 128

1.2、signed char / char
大小:1字节,8位
存储结构:1个符号位 + 7个真值位

正数最大值:0111 1111,2^7-1 = 127
正数最小值:0000 0000,2^0 = 0
正数范围:0~127

*负数最大值: 1111 1111,
除符号位取反:1000 0000,
加1: 1000 0001, -1

*负数最小值:1000 0000,
取反:1111 1111
去掉符位1:0111 1111
加上1为: 1000 0000 , 2^7 =- 128

负数范围-128~-1

所以char范围:-128~127

2、整数的取值范围,内存存储方式

同上分析:
2.1、unsigned
类型 | 字节 | 位数 | 范围
u_char,1 ,8,0~2^7
u_short,2,16,0~2^16, 0~ 128*128, 0~65536
u_int,4,32,0~2^16
u_long,8,64,0~2的64次方
u_long long ,16,208,0~2的208次方

2.2、signed
类型 | 字节 | 位数 | 范围
char,1,8,-2^7 ~ 2^7-1
short,2,16,-2^15 ~2
int,4,32,0~2^16
long,8,64,0~2的64次方
long long ,16,208,0~2的208次方

3、浮点数的取值范围,有效数字,可以位移吗

3.1、存储方式
实数在内存中以规范化的浮点数存放,包括数符、阶码、尾数。数的精度取决于尾数的位数。比如32位机上float型为23位 double型为52位。
单精度float型存储在内存中的大小为4个字节,即32位。
浮点表示的一般形式为:R=M*2^e (R:Real M:Mantissa尾数 e:exponent阶码)
把上面float的二进制可分成三部分:
x xxxxxxxx xxxxxxxxxxxxxxxxxxxxxxx
数符(1b) 阶码(8b) 尾数(23b)
double型的浮点数分别是:数符(1b)、阶码(8b)、尾数(52b)
数符sign:real的正负号 “+”:0 “-“:1
阶码e:e=E-127(double型中e=E-1023) e为正值说明这个浮点数向左移动了e位, e为负值说明这个浮点数向右移动了e位。127=2^7-1 1023=2^10-1
尾数M:有效数字位,这里是有效数字位的部分二进制码

Float单精度浮点数
符号位—-阶码位—-尾数
1位——-8位——-23位
S——–E———-M

Double双精度浮点数
符号位—-阶码位—-尾数
S——–E——-M
1位—–8位—–23位

例1:float型浮点数125.5转化成32位二进制浮点数
125.5的二进制码为1111101.1,写成二进制的科学计数为:1.111101*2^6(因为科学计数法“整数”部分大于1,在二进制中,“整数”部分只能恒为1)即向左移6位,则e=6,则E=e+127=133,而E的二进制码为10000101,而1.111101把“整数”部分去除1之后为111101,之后补0,共23b,形成了阶码。
所以125.5的32位二进制浮点数为
0 10000101 11110100000000000000000
例2:float型浮点数0.5转化成32位二进制浮点数
0.5的二进制码为0.1,写成二进制的科学计数为:1.0*2^(-1)即向右移1位,则e=-1,则E=e+127=126,而E的二进制码为01111110,而1.0把“整数”部分去除1之后为0,之后补0,形成了阶码。

所以0.5的32位二进制浮点数为
0 01111110 00000000000000000000000
double型浮点数类似。
例3:32位二进制浮点数为0 10000010 00010000000000000000000转化成十进制数浮点数
题中已给我们分了三部分,数符部分、阶码部分、尾数部分。
数符部分为0,则代表此数为正数;阶码部分为10000010,则E=130,则e=E-127=3,则说明其向左移了3位,0001加上“整数”部分的1之后,为1.0001。则原二进制数为1000.1=十进制8.5,或R=1.0001*2^3=8.5
其中很多计算类似。可举一反三!

二、转换类型
1、隐式转换
2、显示转换
3、c++调用库给的转换方法
三、经典题目
四、刷题练习

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值