反码
正数的反码是其本身
负数的反码是在其原码的基础上, 符号位不变,其余各个位取反
1111代表-0,0000代表+0,在我们实数的范围内,0有正负之分吗?
0既不是正数也不是负数,那么显然这样的表示依然不够合理!
补码
正数的补码就是其本身 (不变!)
负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)
4bit位能够表示的范围是:-8~+7(C使用的就是补码!)
格式控制符 | 说明 |
%s | 输出一个字符串 |
%c | 输出一个单一的字符 |
%hd、%d、%ld | 以十进制、有符号的形式输出 short、int、long 类型的整数 |
%hu、%u、%lu | 以十进制、无符号的形式输出 short、int、long 类型的整数 |
%f、%lf | 以十进制的形式输出 float、double 类型的小数 |
%e、%le %E、%lE | 以指数的形式输出 float、double 类型的小数。如果 e 小写,那么输出结果中的 e 也小写;如果 E 大写,那么输出结果中的 E 也大写。 |
%g、%lg %G、%lG | 以十进制和指数中较短的形式输出 float、double 类型的小数,并且小数部分的最后不会添加多余的 0。如果 g 小写,那么当以指数形式输出时 e 也小写;如果 G 大写,那么当以指数形式输出时 E 也大写 |
#include <stdio.h>
int main() {
char c = 'A';
printf("变量c的值为:%c 对应的ASCII码为:%d", c, c); //这里我们使用%c来以字符形式输出,%d输出的是变量数据的整数形式,其实就是对应的ASCII码
}A 65
#include <stdio.h>
int main() {
char c = 66;
printf("变量c的值为:%c 对应的ASCII码为:%d", c, c);
}B 66
无符号数
我们知道,所有的数据底层都是采用二进制来进行保存的,而第一位则是用于保存符号位,但是如果我们不考虑这个符号位,那么所有的数都是按照正数来表示
int main() {
unsigned char c = -65; //数据类型前面添加unsigned关键字表示采用无符号形式
printf("%u", c); //%u以无符号形式输出十进制数据
}65二进制1000001,-65 11000001,-65补码10111111,
由于现在没有符号位,一律都是正数,所以,10111111 = 128 + 32 + 16 + 8 + 4 + 2 + 1 = 191
我们没有为其设定初始值,那么它的值就是不确定的了(千万注意并不是不设定值默认就是0)
类型转换
#include <stdio.h>
int main() {
int a = 511;
char b = a; //最大127
printf("%d", b);
}很明显char类型是无法容纳大于127的数据的,因为只占一个字节,而int占4个字节,如果需要进行转换,那么就只能丢掉前面的就只保留char所需要的那几位了,所以这里得到的就是-1:
- 511 = int -> 00000000 00000000 00000001 11111111
- char -> 11111111 -> -1
小数类型在转换回整数类型时,会丢失小数部分(注意,不是四舍五入,是直接丢失小数!)
