整形 数值有不同表示形式
-
2进制------0b10101---1 4 16///十进制的21
-
8进制-----025 5*8^0+2*8^1=21
-
10进制---21
-
16进制---0x15----5*16^0+1*16^1==5+16
整数在内存中的存储:
整数的二进制表示也有3种:
-
1.正整数,原码,反码,补码相同
-
2.负的整数,原码,反码,补码是需要计算的
-
原码:直接通过正负的形式写出的二进制序列就是原码
-
反码:原码的符号位不变,其他位按位取法得到的就是反码
-
补码:反码+1就是补码
整数内存放的是补码的二进制序列
int main()
{
int a = 20;
// //20
// //0000 0000 0000 0000 0000 0000 0000 10100
// // 0x 00 00 14--十六进制
// //0000 0000 0000 0000 0000 0000 0000 10100
// //4位二进制表示一个16进制
// //0000 0000 0000 0000 0000 0000 0000 10100
int b = -10;
// //1000 0000 0000 0000 0000 0000 0000 01010--原码
// // 0x80 00 00 0a
// //1111 1111 1111 1111 1111 1111 1111 10101--反码
// // 0xff ff ff fa
// //1111 1111 1111 1111 1111 1111 1111 0110--补码
// //0xff ff ff f6
return 0;
}
大端【字节序】储存:把一个数据的高位字节序的内容存放在低地址处,把低地址字节序的内容放在高地址处。
11 22 33 44 44 33 22 11 |
低地址 (实际储存的是二进制) 高地址
小端【字节序】储存:把一个数据的高位字节序内容放在高地址处,把低位字节序的内容放在低地址处。
内存:补码
有符号的char(signed char):-128~127
00000000 0 |
00000001 1 |
00000010 3 |
00000011 4 |
。。。。。。 |
01111111 127 |
10000000(
|
.。。。。。 |
11111110 -2 |
11111111 -1 |
无符号数charunsigned char):0~255
00000000 0 |
00000001 1 |
00000010 3 |
00000011 4 |
。。。。。。 |
01111111 128 |
10000000 129 |
.。。。。。 |
11111110 254 |
11111111 255 |
int main()
{
char a = -1;
//10000000 00000000 00000000 00000001
//11111111 11111111 11111111 11111110
//11111111 11111111 11111111 截断->11111111
//1111111 -a
//%d---是打印有符号的整形
//整形提升
//111111111 11111111 11111111 11111111-内存的补码
//10000000 00000000 000000000 00000000-->反码
//10000000 00000000 000000000 00000000--> 原码-->-1
signed char b = -1;
unsigned char c = -1;
//10000000 00000000 00000000 00000001
//11111111 11111111 11111111 11111110
//11111111 11111111 11111111 截断->11111111
//1111111 -c
//整形提升
//因为是unsigned char
//所以补0---00000000 000000000 00000000 11111111--内存补码--255
//正整数的补码,原码,和反码相同
printf("a=%d,b=%d,c=%d", a, b, c);
//-1 -1 255
return 0;
}
%u--打印无符号整形
int main()
{
char a = -128;
printf("%d\n", a);
printf("%u\n", a);
//10000000 00000000 000000000 100000000
//11111111 11111111 111111111 011111111
//11111111 11111111 111111111 100000000
//10000000-a
//11111111 11111111 111111111 100000000-提升
//%u--打印无符号整数--内存存放的是原码
//%d--内存存放的是反码
return 0;
}
int main()
{
char a = 128;
//00000000 00000000 00000000 10000000
//100000000-a
printf("%u\n", a);
//char--有符号整形
//符号位->(最高位)100000000-a
//11111111 11111111 11111111 10000000
printf("%d\n", a);
//11111111 11111111 11111111 10000000
//10000000 00000000 00000000 01111111
//10000000 00000000 00000000 10000000___-128
return 0;
}
int main()
{
int i = -20;
//100000000 0000000000 000000000 00010100
//111111111 1111111111 111111111 11101011
//111111111 1111111111 111111111 11101100
unsigned int j = 10;
//000000000 0000000000 000000000 00001010
printf("%d\n", i + j);
//111111111 1111111111 111111111 11101100
// ++++++++++++++++++++++++++++++++++++++
//000000000 0000000000 000000000 00001010
//=======================================
//111111111 1111111111 111111111 11110110---补码
//100000000 0000000000 000000000 00001001(%d--符号位不变)
//100000000 0000000000 000000000 00001010
return 0;
}