如何在C++中访问数字的符号位?

10 c++ binary bitwise-operators

我希望能够在C++中访问数字的符号位.我当前的代码看起来像这样:

int sign bit = number >> 31;
Run Code Online (Sandbox Code Playgroud)

这似乎有效,给了我0正数和-1负数.但是,我不知道如何得到-1负数:如果是12

0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 1100
Run Code Online (Sandbox Code Playgroud)

然后-12是

1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 0011
Run Code Online (Sandbox Code Playgroud)

将它移位31位就可以了

0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001
Run Code Online (Sandbox Code Playgroud)

这是1,而不是-1,所以当我转换它时为什么我得到-1?

Noc*_*wer 27

那这个呢?

int sign = number < 0;


AnT*_*AnT 15

在C++中右移负数的结果是实现定义的.所以,没有人知道你-12应该在你的特定平台上做什么改变.你认为应该制作上面的(1),而我说它可以很容易地产生全部模式,即-1.后者称为符号扩展移位.在符号扩展移位中,符号位被复制到右侧,但从未移出其位置.

如果您感兴趣的只是符号位的值,那么请停止浪费时间尝试使用按位操作,例如移位等.只需将您的数字与0进行比较,看看它是否为负数.


Pay*_*aya 8

因为你正在转移有符号整数.将整数转换为unsigned:

int sign_bit = ((unsigned int)number) >> 31;
Run Code Online (Sandbox Code Playgroud)


Had*_*ekh 7

您可以使用cmath库

#include <cmath>
Run Code Online (Sandbox Code Playgroud)

并使用它

std::cout << std::signbit(num);
Run Code Online (Sandbox Code Playgroud)

此函数将浮点值作为输入,将bool值作为输出.

true for negative
false for positive
Run Code Online (Sandbox Code Playgroud)

例如

std :: cout << std :: signbit(1);

会给你一个0输出(假)

但在使用此功能时,您必须小心零

std::cout << std::signbit(-0.0);  // 512 (true)
std::cout << std::signbit(+0.0);  // 0   (false)
Run Code Online (Sandbox Code Playgroud)

这条线的输出是不一样的.

要删除此问题,您可以使用:

float x = +0.01;
std::cout << (x >= 0 ? (x == 0 ? 0 : 1) : -1);
Run Code Online (Sandbox Code Playgroud)

给出:

 0 for 0
 1 for positive
-1 for negative
Run Code Online (Sandbox Code Playgroud)