首先,这个结果是在16位系统上才会出现的情况,在现在常用的32位(或者更大)系统上不会出现这个结果.
对于第一行输出,由于127的二进制位是01111111,注意符号位是0,所以在转换到衡御16位的int类型时(由于a1是用%d格式输出的,也就是以int型数字输出),符号位扩展的结果还是原来的数字,所以输出a1=127,由于a2用了%u,也就是无符号整数格式,不关心符号者瞎位,所以输出也是一样的.
第一行输出的b1,因为它的值是129,二进制位是10000001,而且它是占一字节的char类型,同时又因为它的符号位是1,所以在转换到int类型时,符号位扩展的结果就成了1111111110000001,用二进制补码来解释,它就是-127,对于b2,由于它是无符号类型,所以在转换到无符号类型时符号位扩展时会用0填充,所以转换之后就成了0000000010000001,这样,以无符号数解释时,还是129
对于第二行输出,x1和x2的二进制位分别是0111 1111 1111 1111和0000 0000 0000 0000 0111 1111 1111 1111,没有溢出(没有超出对应类型的取值范围),而且在输出时都没有做类型转换,所以会输出原值.y2也是这样的情况,32769没有超出long类型的取值范围,而且输出时也没有转换成其它类型,所咐嫌岩以会输出原值.
对于第二行输出中的y1,由于32769的16位二进制表示是1000 0000 0000 0001,注意到符号位是1,所以按有符号类型int解释时,它就是一个负数,按二进制补码来计算,它的值就是-32767,所以会输出y1=-32767
根本没有啥子程序嘛
C
程序在哪 ?