无符号数
字符类型的无符号值:
所有的数据底层都是采用二进制来保存,而第一位用于保存符号位,当不考虑符号位时,所有的数都按照数值进行保存
#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