Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 需要澄清位移位吗_C - Fatal编程技术网

C 需要澄清位移位吗

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

它打印255。我期望127,因为我期望最左边的位在右移后被设置为0。这是因为我的编译器正在进行正确的旋转吗?

您的编译器将~0视为int,然后进行移位,然后转换为无符号字符。此程序输出您的期望值:

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
    的计算结果为
    0xffffffff
    (假设为32位)
  • 移位后变为:
    0x7fffffff
当存储到
c
(即
unsigned char
)中时,它将截断为
0xff
,即
255

要获得预期的
127
,您需要强制转换
~0

(~0) >> 1

旁注:即使我们只将
0
转换为
无符号字符
,结果仍然是
255
。这是因为隐式整数提升。所有小于
int
的中间体都会升级为
int


更多信息:

我没有看到任何促销活动
0
本身就具有type
int
.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;