标签: twos-complement

从int转到float并返回时,符号会发生变化

考虑以下代码,这是我实际问题的SSCCE:

#include <iostream>

int roundtrip(int x)
{
    return int(float(x));
}

int main()
{
    int a = 2147483583;
    int b = 2147483584;
    std::cout << a << " -> " << roundtrip(a) << '\n';
    std::cout << b << " -> " << roundtrip(b) << '\n';
}
Run Code Online (Sandbox Code Playgroud)

我的电脑(Xubuntu 12.04.3 LTS)上的输出是:

2147483583 -> 2147483520
2147483584 -> -2147483648
Run Code Online (Sandbox Code Playgroud)

请注意b往返后正数如何变为负数.这种行为是否明确规定?我原本期望int-to-float round-tripping至少能正确保存符号......

嗯,在ideone上,输出是不同的:

2147483583 -> 2147483520
2147483584 -> 2147483647
Run Code Online (Sandbox Code Playgroud)

g ++团队是否在此期间修复了错误,或者两个输出都完全有效?

c++ floating-point type-conversion ieee-754 twos-complement

42
推荐指数
2
解决办法
3279
查看次数

为什么在C#中-3 == ~2

无法理解.为什么输出"平等"

码:

 if (-3 == ~2)           
    Console.WriteLine("equal");
 else
    Console.WriteLine("not equal");
Run Code Online (Sandbox Code Playgroud)

输出:

equal
Run Code Online (Sandbox Code Playgroud)

.net c# bitwise-operators twos-complement conditional-statements

37
推荐指数
2
解决办法
1716
查看次数

为什么Integer.MAX_VALUE + 1 == Integer.MIN_VALUE?

System.out.println(Integer.MAX_VALUE + 1 == Integer.MIN_VALUE);

是真的.

我知道Java中的整数是32位,不能超过2 ^ 31-1,但我不明白为什么在MAX_VALUE中加1会导致MIN_VALUE而不是某种异常.没有像Ruby那样透明地转换为更大的类型.

是否在某处指定了此行为?我可以依靠它吗?

java integer integer-overflow twos-complement jls

26
推荐指数
4
解决办法
3万
查看次数

为什么有符号字节的范围是-128到127(2的补码)而不是-127到127?

我读了 为什么Java中的字节范围是-128到127? 它说

128是10000000.倒置,它是01111111,再加一个得到10000000

所以它总结-128是10000000

所以+128不能用8位的2的补码表示,但这意味着我们可以用9位表示它,所以128是010000000,所以取其2的补码-128是110000000,

所以代表-128 10000000或110000000?表示位是否依赖?

为什么不简单地将较低范围-127个8位而不是将-128写为10000000?

math bit-manipulation computer-architecture twos-complement

25
推荐指数
3
解决办法
7万
查看次数

为什么在x86(-64)上有符号和无符号乘法不同的指令?

我认为2的补码的重点是对于有符号和无符号数字的操作可以采用相同的方式.维基百科甚至特别列出了多重作为其中一项有益的操作.那么为什么x86对每个都有单独的指令,mul并且imul?x86-64仍然如此吗?

x86 assembly x86-64 twos-complement

23
推荐指数
3
解决办法
1万
查看次数

在C中表示负数?

C如何表示负整数?

它是通过二进制补码表示还是使用MSB(最重要的位)?

-1十六进制是ffffffff.

所以请为我澄清一下.

c negative-number twos-complement language-lawyer

22
推荐指数
3
解决办法
2万
查看次数

为什么字节b =(字节)0xFF等于整数-1?

为什么byte b = (byte) 0xFF等于integer -1

例如:

int value = byte b = (byte) 0xFF;
System.out.println(value);
Run Code Online (Sandbox Code Playgroud)

它会打印-1吗?

java bit twos-complement

21
推荐指数
4
解决办法
4万
查看次数

如何用2的补码中的分数表示负数?

所以我想代表这个数字-12.5.所以12.5等于:

001100.100
Run Code Online (Sandbox Code Playgroud)

如果我不计算分数,那么它很简单,-12是:

110100
Run Code Online (Sandbox Code Playgroud)

但是什么是-12.5?是110100.100吗?我该如何计算这个负分数?

twos-complement

21
推荐指数
3
解决办法
3万
查看次数

如何在乘以两个2的补码整数时检测溢出?

我想将两个数相乘,并检测是否有溢出.最简单的方法是什么?

algorithm overflow integer-overflow twos-complement

20
推荐指数
2
解决办法
2万
查看次数

在不支持它的系统中“产生负零”是什么意思?

C17 6.2.6.2/4说:

如果实现不支持负零,则未定义&,|,^,〜,<<和>>运算符的行为,其操作数会产生这样的值。

如果我有一个2的补码系统,则它不支持负零。并且它始终利用二进制数的所有可能组合来表示一个值。因此,无论使用哪种按位运算,都不可能产生负零。那么这段文字是什么意思呢?

我认为这部分是指具有1的补码或带符号幅度的系统,该系统不支持负零,而是使用填充位或陷阱表示。它是否正确?

c signed bitwise-operators twos-complement language-lawyer

19
推荐指数
2
解决办法
1524
查看次数