C 需要澄清位移位吗
它打印255。我期望127,因为我期望最左边的位在右移后被设置为0。这是因为我的编译器正在进行正确的旋转吗?您的编译器将~0视为int,然后进行移位,然后转换为无符号字符。此程序输出您的期望值:C 需要澄清位移位吗,c,C,它打印255。我期望127,因为我期望最左边的位在右移后被设置为0。这是因为我的编译器正在进行正确的旋转吗?您的编译器将~0视为int,然后进行移位,然后转换为无符号字符。此程序输出您的期望值: void test() { unsigned char c; c = (~0)>>1 ; printf("c is %u\n",c); } 文本0的类型为int。因此,整个表达式将作为类型int. 表达方式: void test() { unsig
void test()
{
unsigned char c;
c = (~0)>>1 ;
printf("c is %u\n",c);
}
文本
0
的类型为int
。因此,整个表达式将作为类型int.
表达方式:
void test()
{
unsigned char c;
c = ((unsigned char)(~0)) >> 1 ;
printf("c is %u\n",c);
}
计算为类型int
- 因此,
的计算结果为~0
(假设为32位)0xffffffff
- 移位后变为:
0x7fffffff
c
(即unsigned char
)中时,它将截断为0xff
,即255
要获得预期的127
,您需要强制转换~0
:
(~0) >> 1
旁注:即使我们只将
0
转换为无符号字符
,结果仍然是255
。这是因为隐式整数提升。所有小于int
的中间体都会升级为int
更多信息:我没有看到任何促销活动
0
本身就具有typeint
.Ha。不知道我怎么忽略了这一点!当我回到电脑前,我会把它修好的。@rocky,是的。知道(unsigned char)(~0)
将导致0xff
也可能很有趣。然后它被提升回int
作为0x000000ff
。它最终返回127
。值得一提的是,~0
在两个补码(以及符号和大小)中为负数,负整数的右移由实现定义。右移有符号整数的一种常见行为是符号扩展,因此在这种情况下,(~0)>>1
变为0xffffff
(32位int
s)。将其强制转换为无符号字符有效。即使是这样的事情。无符号整数x=~((无符号整数)(~0)>>1);您需要将其强制转换为unsigned以获得预期结果。
c = (unsigned char)(~0) >> 1;