数据类型转换

C语言只能处理同种类型的赋值、计算。当类型不匹配时,会自动进行类型转换。

十进制整数常量类型

C语言中常量默认为有符号的,并且根据值处于的范围默认为相应的类型。
如常量 12, 默认为int
常量 2147483647 默认为int; (4个字节有符号整型表示的最大数值)
常量 2147483648 超出了int 最大存储范围 默认为long int ;
其存储类型是 int 、 long int 、 long long int 中能表示该数的最小类型。

同时我们可以定义常量的类型。
整数
12U 类型为 unsigned int
12L 类型为 long int
12LL 类型为 long long int
U 和 L (大小写均可)的后缀可以组合

浮点数常量

浮点数 如 5.4 默认为双精度类型(double)
定义 float fg = 5.4; 需要先将5.4 转化为单精度后赋值给 fg。
常量 5.4L ,表示的是 long double 类型。
常量 5.4f ,表示的是单精度类型。
常量5.4 ,表示的是double 类型。

输入和输出

整数读写符号符号说明
%u 无符号十进制读写
%o 八进制读写
%x 十六进制读写
%d int 型读写
读写短整型时,需要在d、o、u、x前面加字母h。 如%hd
读写长整型时,需要在d、o、u、x前面加字母l。 如%ld
读取长长整型时,需要在d、o、u、x前面加字母ll。 如%lld

浮点数读写符号说明
%e 、%f、%g 用于读写***单精度***浮点数 ,
读取double 类型时,需要在e、f、g 前放置字符 l ,
e、f、g 可以用于写 float 和 double 类型的值。所以写double 类型的值不需要再e、g、g 前加 字母 l 。
读写long double 类型时,需要在e、f、g 前放置字母 L 。

%e 表示指数形式的浮点数
%f 表示 “定点十进制”形式的浮点数。
%g 根据实际数的大小选择合适的输出方式。数特别大或者特别小时,表示指数形式浮点数,除此之外表示十进制形式浮点数 ,但不会显示尾部的零。

为了让计算机执行算术运算,通常要求操作数有相同的大小(即位的数量相同),并且要求存储方式也相同。 这是因为计算机可以将两个同位数,同类型进行运算。但不能对不同类型的进行运算。 但C语言允许在表达式中使用混合类型,所以需要转换为同种类型,使计算机硬件可以对表达式进行运算。

赋值

如 int a = 5.4; 最终结果 a = 5, 在赋值之前会将 浮点数 5.4 转换为整数 5, 再赋值给整型变量a 。
float ff = 34.5; 由于常量浮点数默认为double 类型,所以也会发送类型转换,导致精度变低,可能会在编译过程中引起警告。
unsigned int a = 4294967295 ( 4个字节的最大值)
当 unsigned int a = 4294967296 时,编译器会警告。因为 a 被赋予的值为0.这是因为 4个字节的int 变量无法存储更大的数,只能按照一定的转换规则进行转换,把转换的结果赋值给 int a 。

将较大类型的值 与为较小类型的值进行运算(赋值,比较大小,传递参数)时,首先需要将类型转换一致后再进行判断。这样隐藏的转换可能会导致难以发现的错误。

算术转换
算术运算符可以用于大多数二元运算符的操作数 如算术运算符,关系运算符。
整数与浮点数进行运算,会将整数转换为对应的浮点数进行运算。如果都为浮点数会将较小的类型转为较大的类型后再进行运算。转换关系为 float -> double -> long double .

只有整数进行运算的话, 会将一切小于 int 型的整型(字符类型,短整型)转换为 int 类型。 然后按照 int -> unsigned int -> long int -> unsigned long int 的等级将较小的类型提升为较大的类型。因为提升主要是改变存储方式和存储位的大小,所以当long int 和unsigned int 的长度一致时,会将两个操作数同时提升为 unsigned long int 。

强制类型转化

(类型名) 表达式
C语言将 (类型名) 视为一元运算符 ,一元运算符的优先级高于二元运算符。 同时二元运算符运算之间,需要对操作数进行整型提升,使表达式的结果为 类型等级较高的一个。

如 int a = 45;
float f = 6.7 - (float)a;

有符号数和无符号数转化的规则

由于数据再内存中以补码的形式存储,所以当无符号的值未超过 有符号整型的最大值时,值是一致的。当超过后,再内存中存储方式不变,但是当以补码的形式解释是,最高位为负数,为负数。负数需要通过补码求原码。除符号位不变。其他未求反后加1,得到原码。

unsigned int b = 0; 00000000 00000000 00000000 00000000
int a = ~b; 11111111 11111111 11111111 11111111
因为最高位为1,而类型为整型,所以这是负数补码。求负数的值应该符号位不变,其他位求反后 加1。 10000000 00000000 00000000 00000001.这是负数的原码。结果为-1.

当有符号整数的负数传递给无符号数时,存储数值解释为非负数。非负数的原码为补码。 所以可以直接计算。
int a = -2; 原码为 10000000 00000000 00000000 00000010
反码为 11111111 11111111 11111111 11111101
补码为反码加1 11111111 11111111 11111111 11111110
所以补码是存储在内存中的,
unsigned int b = a;
b 指向a 的内存,将补码解释为非负数。所以补码等于原码。 直接计算后值为 4294967294。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值