数据类型:整数
1.C的数据类型
没有特殊需要,就用int类型


- sizeof
- 一个字节(byte)有8位(8个bit)


int a = 1; printf("sizeof(a)=%ld\n", sizeof(a)); //sizeof(a)=4 printf("sizeof(a+1)=%ld\n", sizeof(a)); //sizeof(a+1)=4,a=1 printf("sizeof(a+1.0)=%ld\n", sizeof(a+1.0)); //sizeof(a+1.0)=8,a=1
2.整数类型
2.1 对于整数有:char、short、int、long、long long 五种类型,其中int类型字长与计算机CPU寄存器有关,32位的则为4字节,64位的则为8字节。

2.2 整数在计算机中的表示:关于补码,-1用1111 1111表示,1仍用0000 0001表示,则1 + -1 = 0 表示为0000 0001 + 1111 1111 = 1 0000 0000,多出来的一位1被丢掉,即为8位的0。
补码的意义:即补码+原码(如-1为原码1的补码)的和得到一个带溢出的0。所以在二进制计算中对于a + (-b),只要用b的补码去代替(-b)做二进制加法就可以了。
如128为2的7次方,即为1000 0000,那么-128就是0-128,即为1 0000 0000 - 1000 0000 = 1000 0000。
2.3 数的范围、整数越界

对于signed int,1开头的表示负数,除了0000 0000外的0开头的表示正数。

//关于补码 #include <stdio.h> int main() { char c = 255; //char为1个字节,默认为带补码的范围,即表示范围为-128~127 // unsigned char c = 255; //前面加上unsigned就表示不带补码的范围,此时二进制1111 1111就表示255,printf的结果c=255 int a = 255; //int为4个字节,带补码的范围为-(2^(32-1))~2^(32-1)-1 printf("c=%d,a=%d\n", c, a ); //c=-1,a=255 return 0; }


//关于整数越界 #include <stdio.h> int main() { char c = 127; //char为1个字节,默认为带补码的范围,即表示范围为-128~127 // unsigned char c = 255; //unsigned后,二进制1111 1111就表示255,c+1则为256,256的二进制为1 0000 0000,越界了即为0000 0000,即为0,故printf输出c=0 c = c + 1; printf("c=%d\n", c ); //c=-128 return 0; }
2.4 整数的格式化输入与输出
- 整数的输入输出只有两种形式:int 或者 long long
- %c:char
- %h:short %hd以十进制打印short、 %hx以十六进制打印short、 %ho以八进制打印short
- %d:int 如果系统性int和long的sizeof相同,则打印long用%d也可以,但是移植到其他不相同的系统中可能出现问题。
- %u:unsigned int
- %ld:long %lx 以十六进制打印long、%lo 以八进制打印long
- %lld:long long
- %llu:unsigned long long
//关于整数输入输出 #include <stdio.h> int main() { char c = -1; //char为1个字节,默认为带补码的范围,-1即为1111 1111 int a = -1; //int为4个字节,-1即为1111 1111 1111 1111 1111 1111 1111 1111,即为十进制数4294967295 printf("c=%u, a=%u\n", c, a ); // unsigned 输出结果为c=4294967295, a=4294967295 /* c虽然为char,一个字节,但输出%u为int类型,故自动补上剩余的1,即32个1 */ return 0; }
- 一个以0开头的数字字面量是8进制数
- 一个以0x开头的数字字面量是16进制数
- 输入012计算机会自动识别其为8进制数,并按对应的二进制数存储
- 输入0x12计算机会自动识别其为8进制数,并按对应的二进制数存储
- 想要输出8进制数用%o,想要输出16进制数用%x或%X,但没有前缀0和0x
- 想要输出8进制数012用%#o或0%o,想要输出16进制数0x12用%#x或0x%x
//关于整数8进制数与16进制数 #include <stdio.h> int main() { char c = 012; //8进制数 int a = 0x12; //16进制数 printf("c=%d, a=%d\n", c, a ); // 输出结果十进制为c=10, a=18 return 0; }

浙公网安备 33010602011771号