首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么-1 >> 1和0 0xFFFFFFFF >> 1产生不同的结果?

为什么-1 >> 1和0 0xFFFFFFFF >> 1产生不同的结果?
EN

Stack Overflow用户
提问于 2014-07-10 02:29:15
回答 2查看 2K关注 0票数 10

我试着做一个测试,看看我的PC是通过右移十六进制FFFFFFFF执行算术,还是通过1执行逻辑右移。

我知道整数-1在十六进制中读取为FFFFFFFF,因为它是两个1的补充。右移-1通过1得到FFFFFFFF,并显示PC实现了算术右移.

但是如果我只输入0xFFFFFFFF >> 1,它就会导致7FFFFFFF并显示PC执行逻辑右移。为什么会发生这种事?有关产生结果的代码,请参见下面的代码:

代码语言:javascript
运行
复制
#include    <stdlib.h>
#include    <stdio.h>

int main ( int argc, char *argv[] )
{
    printf ( "%x >> 1 = %x\n", -1, -1 >> 1 );
    printf ( "%x >> 1 = %x\n", 0xffffffff, 0xffffffff >> 1 );

    return EXIT_SUCCESS;
}

该程序的输出是:

代码语言:javascript
运行
复制
ffffffff >> 1 = ffffffff
ffffffff >> 1 = 7fffffff
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-10 02:39:12

这不是一个假设。你认为0xffffffff是哪种类型的?根据C标准,即6.4.4.1整数常量,十六进制常数的表达式类型(在0x之前)是第一个可应用程序保持表示值的表达式:

代码语言:javascript
运行
复制
int
unsigned int
long int
unsigned long int
long long int
unsigned long long int

在您的平台上,0xFFFFFF不能表示为int,因为int是32位,在signed int中只有31位表示量(标准规定一位保留给符号)。因此,使用下一个类型,unsigned int。因此,没有符号位可以用移位操作进行扩展,因此移位操作是逻辑的,而不是算术的。

我如何得出int是您平台上32位的结论可能还不太清楚。事实上,如果没有第一行,我就无法做出这样的假设,因为第一行的算术--右移--改变了-1的值。这一转变的结果--被抛弃为%x --是0xFFFFFFFF。如果int是本地的64位,那么应该转储0xFFFFFFFFFFFFFFFF。如果没有这些先验知识,就不能假定0xFFFFFFFF的任何一种类型的结论,因为它很可能可以表示为具有值0x00000000FFFFFFFF的标准带符号64位的int (63+1)。由此产生的转换将产生与您现在看到的输出相同的结果,从而引入一个替代上述假设的选项。

票数 9
EN

Stack Overflow用户

发布于 2014-07-10 02:38:48

您的主要问题是:0xffffffff是否没有签名?

取自C11§6.4.4.1整数常数

整数常量的类型是可以表示其值的对应列表中的第一个。

第一个printf行的输出表明,机器上的int是32位。因此,它不能表示0xffffffff,它必须是无符号的。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24666567

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档