定点整数分析(C语言)

问题

TIM截图20190309205944.png

编译运行环境

Visual C++ 6.0 ,Windows 10

测试代码

#include 

int main()
{
    short si = -32768;
    unsigned short usi = si;
    int i = si;
    unsigned int ui = usi;
    //int a = 15;


    printf("变量类型  \t\t占用字节\n");
    printf("short\t\t\t%lu \n", sizeof(short));
    printf("unsigned short\t\t%lu \n", sizeof(unsigned short));
    printf("int \t\t\t%lu \n", sizeof(int));
    printf("unsigned int\t\t%lu \n", sizeof(unsigned int));

    printf("\n\n");

    printf("变量\t真值\t\t十六进制值\n");
    printf("si\t%d\t\t%x\n",si,si);
    printf("usi\t%d\t\t%x\n",usi,usi);
    printf("i\t%d\t\t%x\n",i,i);
    printf("ui\t%d\t\t%x\n",ui,ui);
    

    //printf("a\t%x\t\t%x\n",a,a);

    return 0;
}

结果

image.png

结果分析

  • 1、首先程序是32位的Windows程序,所以我们先打印出对应的基本数据类型所占的字节。可以看到short为2字节(16位),int为4字节(32位)。

  • 2、然后si的真值为-32768 对应的机器数补码为1000 0000 0000 0000B即8000H,%x的意思是把数据进行16进制的输出(32位格式)。所以我们看到最后的结果是ffff8000,这里的输出结果进行了数位扩展(符号扩展,原值没有进行扩展)的操作:
    1000 0000 0000 0000
    扩展后的值为
    1111 1111 1111 1111 1000 0000 0000 0000
    打印出来就是ffff8000H。

  • 3、usi直接接收了si的机器值1000 0000 0000 0000B,unsigned short 没有符号位,所以打印的值位32768。16进制值就是8000,省略了前面的4个0。

  • 4、i的类型为int,是4个字节,接收si的机器值1000 0000 0000 0000B后直接进行符号扩展的操作,然后机器数的值为:1111 1111 1111 1111 1000 0000 0000 0000B ,对应16进制为ffff8000H,真值为-32768。

  • 5、经过上面的一番分析后,ui就比较简单了,ui的机器数的值为:0000 0000 0000 0000 1000 0000 0000 0000B ,对应16进制的值为8000H,真值为32768。

扩展阅读

  • C语言数据类型http://www.runoob.com/cprogramming/c-data-types.html

你可能感兴趣的:(定点整数分析(C语言))