发布网友 发布时间:2022-04-23 21:17
共3个回答
热心网友 时间:2023-10-09 22:08
由于char类型比int类型级别低,C规定不同类型表达式的结果取较高级的类型,常数整数被默认是int型,所以a-1的类型是int型,因此输出按int类型处理;a-1是8个1,最高位是1,输出时被解释为负数,用1在左侧扩展到32位,它就是-1。而a = a-1的等号右侧同样是int型,但左侧是unsigned char型,赋值规则规定要将右侧的类型转换为左侧类型赋给左侧变量,那么结果是unsigned char型,尽管也是8个1,最高位也是1,但因按“无符号”型对待,所以输出时用0扩展到32位,结果就是255。你可以做个试验,把第一个代码的printf("%d",a-1);改成printf("%d",a=a-1);输出肯定也是255,。这里的关键是输出是用%d控制的,它是对应int型的,就要看对原变量按无符号型扩展还是按有符号型扩展了。
热心网友 时间:2023-10-09 22:08
为何第一种形式的代码输出结果不是255而是-1?
这是因为a-1时,是两个不同类型的量做减法,系统自动把unsigned char转换为现多位数的int,进行相减。结果当然是-1。
而第二种形式的输出结果就是255,这是因为系统把-1赋值给一个unsigned char时,因-1的机器码是32位二进制1,所以,它只把8位的二进制1赋给a,而a是一个unsigned char,它的表示范围为0~255,所以,在unsigned char的解释下,8位二进制数11111111就是十进制255了。
热心网友 时间:2023-10-09 22:09
char是8位的数据类型,0再减1就是0xFF,如果是无符号数它就表示255,有符号就是-1,你形式中中直接以%d输出当然结果就是-1,形式二中是将它赋值给了unsigned char,再输出,结果就是255,当然如果你在