1.进制的表示
进制:进位计数制,10进制,7进制(周),24进制(小时),60进制(分和秒)
十进制:12345.6 == 1*10^4 + 2*10^3 + 3*10^2 + 4*10^1 + 5*10^0 + 6*10^-1 按权重展开相加
二进制(0~1,共两个符号,前面加一个0):10101 == 1*2^4 + 0*2^3 + 1*2^2 + 0*2^1 + 1*2^0 = 16+4+1 = 21
八进制(0~7,共八个符号): 123 == 1*8^2 + 2*8^1 + 3*8^0 == 64+16+3 == 83
十六进制(0~9,a~f/A~F, 一共是16个符号,前面加上0x/0X):1a1 == 1*16^2 + 10*16^1 + 1*16^0 == 256+160+1 == 417
(下面的整数值全是无符号值,假设下面使用的都是一字节的整数)
第一个问题:其他进制怎么转化成10进制? 按权重展开相加
第二个问题:10进制怎么转化成其他进制?
10进制->2进制:1.基数相除,倒序取余 2.一直凑
100 -> 110 0100
123 -> 0111 1011
234 -> 1110 1010(不考虑正负)
10进制->8进制,16进制的方法(1.先将10进制值转换成2进制,2.再将2进制转换成我们所需要的8进制或16进制)
10进制->8进制(1.将其转换成2进制 2.从右向左,三三分组,左边不够的话补符号位)
100 -> 001 100 100 -> 0144(八进制)
10进制->16进制(1.将其转换成2进制 2.从右向左,四四分组,左边不够的话补符号位)
100 -> 0110 0100 -> 0x64(十六进制)
8进制如何转换16进制:先变成2进制,再转16进制
练习题:
10->8:
124->001 111 100 ->174
88 ->001 011 000 ->130
10->16:
111->0110 1111 -> 6f
66 ->0100 0010 -> 42
2.整数数据类型和小数数据类型
C语言有哪些基础数据类型:
整型:char(1,迷你的整形值), short(2), int(2/4,默认), long(4), long long(8)
浮点值:float(4) double(8,默认),(long double可以类似当做double处理)
//布尔类型:bool == unsigned char
//unsigned(无符号) signed(有符号) 最高位当做符号位 0表示整数 1表示负数
第一个问题:long和int都是4个字节,为什么设计成两个?
int是2/4(32和64位下区别不同)
第二个问题:编译器为什么给设计出来这么多的内置类型?
让你根据不同的需求去选择不同的数据类型
第三个问题:每一个数据类型的范围大概是多少?
例如:char类型 8个位 能表示的数值可能性有2^8==256种
如果unsigned char(无符号)的范围是0~255
如果 char(默认有符号)的范围是-128 ~ 127
3.原码;反码;补码;
原码,反码,补码:最高位当做符号位 0表示正数 1表示负数
无符号整数:按权展开相加
有符号整数:
正数:原码 == 反码 == 补码
负数:1.将其绝对值按位取反,得到反码 2.对反码+1得到补码
-12:0000 1100 -> 1111 0011 -> 1111 0100
-13:0000 1101 -> 1111 0010 -> 1111 0011
127:0111 1111 三码合一
-128:1000 0000 -> 0111 1111 -> 1000 0000
-1:0000 0001 -> 1111 1110 -> 1111 1111
-1+1 = 1111 1111 -> 10000 0000 -> 0000 0000
short(2^16==65536 有符号范围为-32768~32767)
int(2^32==42亿多, 有符号范围为-20E ~ 20E)