1、进制转换
计算机中的进制有二进制、八进制、十进制、十六进制,十进制是逢十进一,八进制逢八进一,以此类推,x进制逢x进1。
二进制、八进制、十六进制转十进制规律是相同的,都是按权求和
(10010)2 = (1 * 2^4 + 0 * 2^3 + 0 * 2^2 + 1 * 2^1 + 0 * 2^0)10
(234)8 = (2 * 8^2 + 3 * 8^1 + 4 * 8^0)8
(1a2) = (1 * 16^2 + a * 10^1 + 2 * 16^0)16
十进制转二进制:
(103)10 ->(01100111)2->(147)8->(67)16
128 64 32 16 8 4 2 1
0 1 1 0 0 1 1 1
每三位二进制就是一位八进制
001 100 111
1 4 7
每四位二进制就是一位十六进制
0110 0111
6 7
2、C语言中的数据类型
signed:有符号类型
char 1byte
short 2byte
int 4byte
long iny 4byte
long long 8byte
unsigned:无符号
unsigned char 1byte
unsigned short 2byte
unsigned int 4byte
unsigned long int 4byte
unsigned long long 8byte
浮点数:
float: 4byte
double 8byte
long double 8byte,12byte,16byte
布尔类型
bool 1byte
空类型
void(不能定义变量,可以定义指针)
计算机中数据的存储方式
以二进制进行存储
一、计算机存储整型数据:
计算机存储整型数据是以补码存储
计算机按照补码计算
原码:就是二进制定点表示法,即最高位为符号位,“0”表示正 “1”表示负,其余位表示数值的大小。
正数的原码 =》反码=》补码
负数的原码 -> 符号位不变按位取反变成反码->在加1变为补码。
补码变原码->符号位不变按位取反在加1
例如:n = 8 1+7 按照8个二进制位存储
求补码:
5 : 0000 0101(原码、反码、补码相同)
第一种方法:-5:2^8 - 5
10000 0000
0000 0101
1111 1011 (补码)
第二种:-5: 1000 0101 原码
1111 1010 反码(加1 )
1111 1011 补码
2、 n = 16 1+15 按照16个二进制位存储
5: 0000 0000 0000 0101
-5 : 2^16 - 5
1 0000 0000 0000 0000
0000 0000 0000 0101
1111 1111 1111 1011 (补码)
3、数据的表示范围
用char类型进行举例说明
int main()
{
for(char a = 0;a < 128;++a)
{
printf("%5d",a);
}
}
char 1字节8个二进制位 -128~-1 0~127
(127) 0111 1111 + 1 = 1000 0000(-128) 1为符号位,为-128
unsigned char : 0 ~ 255
为什么会用补码存储整型数据呢?
cpu只有加法,取反,左移,右移,减法可以用加法替换,使用补码来做加法运算,将使计算机的基础硬件单元加法器的设计大大简化,提高了计算机的整体性能。
4、扩充和截取
扩充:有符号数
char a = 5;
short x = (short)a;
short x = a;
char a : 0000 0101
有符号扩充符号位 ,short是两字节因此要扩充 0000 0000 0000 0101
char a = -5;
short x= (short)a;
short x= a;
-5: 1111 1011
扩充:1111 1111 1111 1011
无符号扩充:扩充0
unsigned char a = 5;
short x = (short)a;
short x = a;
5 : 0000 0101
扩充:0000 0000 0000 0101
截取:
int x = 0x123456A8
short a = x;
char a = x;
高地址 ——> 低地址
0x123456A8
x : 0001 0010 0011 0100 0101 0110 1010 1000
short a : 0101 0110 1010 1000
char a : 1010 1000
5、类型转换
算数类型转换和赋值类型转换
1、类型相容:类型不同但系统可以自动进行转换
但是只针对于基本数据类型,指针、数组、结构体类型、联合体、枚举类型不具有此性质。
数据类型转换:隐式类型转换、显示类型转换
2、隐式类型转换规则:
两个操作数之一是double?->另一个也转换成double,
同理由高到低如下:unsigned long long -> long long ->unsigned int ->int ->当操作数为char / short 时,则转换为int.
int main()
{
char a = -5; 1000 0101
unsigned int b = 10; 1111 1010
if(a > b) 1111 1011
{
printf("%d > %d \n",a,b);// -5 > 10
printf("%u > %u \n",a,b);
}
else
{
printf("%d < %d \n",a,b);
}
return 0;
}
char类型a要转换成unsigned int a要进行扩充成四个字节
有符号扩充符号位 所以 a: 1111 1111 1111 1111 1111 1111 1111 1011 然后我们会把他识别成一个无符号整型
int main(