1.整形数据类型包括charshortintlong分有符号和无符号
2.整形数据在内存中的存储整形在内存中由二进制的形式存储,分原码反码和补码,第一位是符号位其余是数值位,符号位0为正,1为负;正整数的原码反码和补码相同,负整数的 原码 就是十进制直接转换二进制,反码 由原码除符号位其他位按位取反,补码 由反码加一。整数在内存中存储的均为补码,运算时也是补码进行运算,输出是转换成原码。
3.大小端存储大端存储(高低低高):低字节内容放到高地址处,高字节内容放到低地址处。小端存储(高高低低):高字节内容放到高地址处,低字节内容放到低地址处。
4.整型提升无符号数--高位补零有符号数--高位补符号位
%u-输出无符号整形%d-输出有符号整形
1.
1.
//
输出什么?
#include <stdio.h>
int
main
()
{
char
a
= -
1
;
signed char
b
=-
1
;
unsigned char
c
=-
1
;
printf
(
"a=%d,b=%d,c=%d"
,
a
,
b
,
c
);
return
0
;
}
//答案a=-1,b=-1,c=255;
#include <stdio.h>
int
main
()
{
char
a
= -
1
;
//1000 0000 0000 0000 0000 0000 0000 0001--原码
//1111 1111 1111 1111 1111 1111 1111 1110--反码
//1111 1111 1111 1111 1111 1111 1111 1111--补码
//由于a是char类型,所以a在内存中--1111 1111
signed char
b
=-
1
;
//1000 0000 0000 0000 0000 0000 0000 0001--原码
//1111 1111 1111 1111 1111 1111 1111 1110--反码
//1111 1111 1111 1111 1111 1111 1111 1111--补码
//由于b是char类型,所以b在内存中--1111 1111
unsigned char
c
=-
1
;
//1000 0000 0000 0000 0000 0000 0000 0001--原码
//1111 1111 1111 1111 1111 1111 1111 1110--反码
//1111 1111 1111 1111 1111 1111 1111 1111--补码
//由于c是char类型,所以c在内存中--1111 1111
printf
(
"a=%d,b=%d,c=%d"
,
a
,
b
,
c
);
//整形提升 a--有符号,补符号位,a的补码1111 1111 1111 1111 1111 1111
1111 1111
a的原码1000 0000 0000 0000 0000 0000 0000 0001
// b--有符号,补符号位,b的补码1111 1111 1111 1111 1111 1111
1111 1111
// b的原码1000 0000 0000 0000 0000 0000 0000 0001
// c--无符号位,补零,c的补码0000 0000 0000 0000 0000 0000 1111 1111
// 以%d的形式打印,打印的是有符号的,c现在的符号位是0,是正数, 所以原码,反码,补码一样
return
0
;
}
2.
#include <stdio.h>
int
main
()
{
char
a
= -
128
;
printf
(
"%u\n"
,
a
);
return
0
;
}
//答案是4294967168
#include <stdio.h>
int
main
()
{
char
a
= -
128
;
//a的补码1111 1111 1111 1111 1111 1111 1000 0000
//a--1000 0000
//a是有符号的,所以整形提升补符号位
//1111 1111 1111 1111 1111 1111 1000 0000
//1000 0000 0000 0000 0000 0000 1000 0000
//因为%u所以第一位为数值位。
printf
(
"%u\n"
,
a
);
return
0
;
}
3.
#include <stdio.h>
int
main
()
{
char
a
=
128
;
printf
(
"%u\n"
,
a
);
return
0
;
}
//答案是4294967168
#include <stdio.h>
int
main
()
{
char
a
=
128
;
//a的补码0111 1111 1111 1111 1111 1111 1000 0000
//a--
1000 0000
//a是有符号的,所以整形提升补符号位,现在的符号位是1(标红的那个)
//1111 1111 1111 1111 1111 1111 1000 0000
//1000 0000 0000 0000 0000 0000 1000 0000
//因为%u所以第一位为数值位。
printf
(
"%u\n"
,
a
);
return
0
;
}
4.
#include <stdio.h>
int
main
()
{
int
i
= -
20
;
//1000 0000 0000 0000 0000 0000 0001 0100
//1111 1111 1111 1111 1111 1111 1110 1011
//1111 1111 1111 1111 1111 1111 1110 1100
unsigned
int
j
=
10
;
//0000 0000 0000 0000 0000 0000 0000 1010
printf
(
"%d\n"
,
i
+
j
);
//按照补码的形式进行运算,最后格式化成为有符号整数
return
0
;
}