c中整型的溢出

/**
 * 整型的溢出
 * 数据类型 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;
}

猜你喜欢

转载自www.cnblogs.com/goujian/p/11800038.html