【发布时间】:2021-03-10 21:59:13
【问题描述】:
我尝试了以下代码,期望输出为正 64:
char val = 0x80;
printf("%d",val>>1);
我对发生的事情的理解是(如果我可能错了,请纠正我):
- 参考 ASCII 表,没有 0x80 到任何字符的映射,所以我假设它存储为无符号整数。
- 这表示为按位格式的 1000 0000,因此右移 1 将导致 0100 0000
- 当打印为整数值时,它将显示为正 64。
但是显示-64。
相比之下:
char val = 0x40;
printf("%d",val>>1);
给出正值 32。
值是否在第一种情况下隐式转换为有符号整数,而不是在第二种情况下?
【问题讨论】:
-
如果
char在您的实现中签名,则(int)(char)0x80的值更像二进制1111 1111 1111 1111 1111 1111 1000 0000 -
so i assume this is stored as an unsigned integer.- 很可能,您使用的char和隐含的int都没有签名。如果您想要未签名的行为,请明确说明。 -
char的类型不会根据您在其中存储的内容而改变。如果char被签名,那么0x80也是-128。如果char被签名,那么val>>1要么是未定义的,要么是实现定义的(不记得是哪个),但是回到输出-64那么你的char不能是未签名的。 -
char类型在传递给像printf()这样的可变参数函数时会提升为int。它也被提升为int以执行轮班。由于有符号的int可以保存char、signed char和unsigned char的所有可能值,因此无论char的符号性如何,转换后的值都是int类型。
标签: c bit-manipulation placeholder signed shift