无符号数和数据类型转换

无符号数

字符类型的无符号值:

所有的数据底层都是采用二进制来保存,而第一位用于保存符号位,当不考虑符号位时,所有的数都按照数值进行保存

#include <stdio.h>

int main() {
    unsigned char a = -65;
    printf("%u",a);
}
191
进程已结束,退出代码0

首选char占据1一字节,也就是八个bit位

换算过程如下:

-65= 【1100 0001】原=【1011 1111】补

由于没有符号位所以所以的数值都是正数也就是【1011 1111】补=128+32+16+8+4+2+1=191

我们可以看到给一个无符号的char类型的-65的值时输出的结果却是191,很明显符号位也是作为数值表示的一部分,所以结果不是-65

整数类型的无符号值:

有符号值的int类型的数据能表示的范围是:-2147483648~2147483647

我们也可以直接打印数字类型的无符号类型:

#include <stdio.h>

int main() {
    // unsigned char a = -65;
    unsigned int a = -1; // 因为-1的二级制补码都是一所有可以获取到int类型的无符号的最大值
    printf("%u",a);
}

4294967295
进程已结束,退出代码0

通过上面的源代码我们可以得到int类型的无符号的最大值为:4294967295

数据类型的转换

一种类型的数据可以转换为其他的类型的数据,这种操作叫做类型转换,类型转换可以分为自动类型转换和强制类型转换

自动类型转换

#include <stdio.h>
int main() {
    short a = 10;
    int i = a;
    // 自动类型转换,也就是编译器进行隐式的数据类型转换
    float c = 3; // 这个也是自动类型转换
}

但是如果使用一个比转化的类型最大值都还要大的值进行类型转换时,它只会保留自己所需要的几位:

#include <stdio.h>

int main() {
    int a = 511;
    char b = a; // char的最大值为127超出chard的最大值
    printf("%d",b);
}
-1
进程已结束,退出代码0

换算过程:

511 = int【00000000 00000000 00000001 11111111】

char 【1 11111111】 = 【11111111】只保留8位 = -1

整数和小数类型的转换

int main(){
    int b = 3;
    double i = b;
    printf("%f",i);
}
3.000000
进程已结束,退出代码0

小数转整数类型

#include <stdio.h>

int main(){
    double b = 3.88;
    int i = b;
    printf("%d",i);
}
3
进程已结束,退出代码0

当小数类型转换为整数类型的时候小数部分可能会丢失(只是丢失并不是四舍五入而是直接丢失)

除了赋值操作会制动转换以为运算中也会进行自动类型的转化

#include <stdio.h>

int main() {
    float a =2;
    int b = 3;
    double c = b/a;
    printf("%f",c);
}
1.500000  
进程已结束,退出代码0	

最后输出的数据类型为double类型,中间数据类型的转换过程:

a:float =>double / b:int =>double = c:double

这样转换的依据为:

请添加图片描述

不同的数据类型优先级不同

char和short类型在参与运算时一律转换为int再进行计算

浮点数类型默认为双精度进行计算

当一个更高优先级类型和一个低优先级的类型同时参与运算时,统一转换为高优先级进行运算。

强制类型转换

强制转换类型 值 = (强制转换类型) 变量、常量或表达式;
#include <stdio.h>

int main() {
// 强制类型转换
    double a = 3.84;
    // 对a进行强制转换
    int b = (int) a;
    // 先对a进行强制转换然后再进行运算
    int c = (int) a+3.8;
    // 先对小括号里面的进行运算然后对结果进行强制转换
    int d = (int) (a+3.8);
    printf("%d",b);
    printf("\n");
    printf("%d",c);
    printf("\n");
    printf("%d",d);
}
3
6
7
进程已结束,退出代码0

合理的使用强制类型转换可以帮助我们解决很多运算中的问题;例如:

自动类型转换:

#include <stdio.h>

int main() {
    int a = 10, b = 3;
    double c = 10 / 3;
    printf("%f",c);
}

计算结果是错误的:

3.000000
进程已结束,退出代码0

使用强制类型转换:

#include <stdio.h>

int main() {
    int a = 10, b = 3;
    double c =(double) 10 / 3;
    printf("%f",c);
}

计算结果为我们想要的结果

3.333333
进程已结束,退出代码0

的:

3.000000
进程已结束,退出代码0

使用强制类型转换:

#include <stdio.h>

int main() {
    int a = 10, b = 3;
    double c =(double) 10 / 3;
    printf("%f",c);
}

计算结果为我们想要的结果

3.333333
进程已结束,退出代码0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿龙的代码在报错

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值