/** * 整型的溢出 * 数据类型 short, long, long long, unsigned int */ #include <stdio.h> int main(int argc, char *argv[]) { short i = -24; // 将-24以无符号int类型输出,实际输出的是 // 其补码转换成的十进制数 printf("将 %d 以无符号整型输出为 %u\n", i, i); // 将 -24 以无符号整型输出为 4294967272 printf("将 %d 以十六进制(小写x)输出为 %x\n", i, i); // 将 -24 以十六进制(小写x)输出为 ffffffe8 printf("将 %d 以十六进制(大写X)输出为 %X\n", i, i); // 将 -24 以十六进制(大写X)输出为 FFFFFFE8 printf("将 %d 以八进制输出为 %o\n", i, i); // 将 -24 以八进制输出为 37777777750 printf("short类型占 %d 个字节\n", sizeof(short)); // short类型占 2 个字节 // long // 在32位系统下unix系统占4个字节 // 在64位系统下unix系统占8个字节 // 不是很固定,在程序中尽量少用long printf("long类型占 %d 个字节\n", sizeof(long)); // long类型占 8 个字节 // long long // 占8个字节,64位,是固定的,对于32位系统,cpu的寄存器 // 是32位,所以计算long long的类型的数据,效率会很低 printf("long long类型占 %d 个字节\n", sizeof(long long)); // long long类型占 8 个字节 printf("unsigned int类型占 %d 个字节\n", sizeof(unsigned int)); // unsigned int类型占 4 个字节 printf("unsigned short类型占 %d 个字节\n", sizeof(unsigned short)); // unsigned short类型占 2 个字节 printf("unsigned long类型占 %d 个字节\n", sizeof(unsigned long)); // unsigned long类型占 8 个字节 printf("unsigned long long类型占 %d 个字节\n", sizeof(unsigned long long)); // unsigned long long类型占 8 个字节 // 整数溢出 // 计算一个整数的时候超过整数能够容纳的最大单位后 // 整数会溢出,溢出的结果是高位被舍弃 unsigned short abc = 0xffff; abc = abc + 1; printf("abc = %d\n", abc); // abc = 0 unsigned short n1 = 0xffff; // n1 += 100 <=> n1 + 1 + 99 n1 += 100; printf("n1 = %d\n", n1); // n1 = 99 unsigned short n2 = 2; n2 -= 5; // 输出的是-3对应的补码的整数值 printf("n2 = %d\n", n2); // n2 = 65533 int n3 = 0x12345678; n2 = n3; printf("n2 = %x\n", n2); //n2 = 5678 short n4 = -2; // 当一个小的整数赋值给一个大的整数时,符号位不会丢失 // 若为正则补0,为负补1 n3 = n4; printf("n3 = %x\n", n3); // n3 = fffffffe unsigned short n5 = 0; n5 -= 1; printf("n5 = %x\n", n5); // n5 = ffff return 0; }
来源:https://www.cnblogs.com/goujian/p/11800038.html