考虑以下代码,这是我实际问题的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 ++团队是否在此期间修复了错误,或者两个输出都完全有效?
无法理解.为什么输出"平等"
码:
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
System.out.println(Integer.MAX_VALUE + 1 == Integer.MIN_VALUE);
是真的.
我知道Java中的整数是32位,不能超过2 ^ 31-1,但我不明白为什么在MAX_VALUE中加1会导致MIN_VALUE而不是某种异常.没有像Ruby那样透明地转换为更大的类型.
是否在某处指定了此行为?我可以依靠它吗?
我读了 为什么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?
我认为2的补码的重点是对于有符号和无符号数字的操作可以采用相同的方式.维基百科甚至特别列出了多重作为其中一项有益的操作.那么为什么x86对每个都有单独的指令,mul并且imul?x86-64仍然如此吗?
C如何表示负整数?
它是通过二进制补码表示还是使用MSB(最重要的位)?
-1十六进制是ffffffff.
所以请为我澄清一下.
为什么byte b = (byte) 0xFF等于integer -1?
例如:
int value = byte b = (byte) 0xFF;
System.out.println(value);
Run Code Online (Sandbox Code Playgroud)
它会打印-1吗?
所以我想代表这个数字-12.5.所以12.5等于:
001100.100
Run Code Online (Sandbox Code Playgroud)
如果我不计算分数,那么它很简单,-12是:
110100
Run Code Online (Sandbox Code Playgroud)
但是什么是-12.5?是110100.100吗?我该如何计算这个负分数?
我想将两个数相乘,并检测是否有溢出.最简单的方法是什么?
C17 6.2.6.2/4说:
如果实现不支持负零,则未定义&,|,^,〜,<<和>>运算符的行为,其操作数会产生这样的值。
如果我有一个2的补码系统,则它不支持负零。并且它始终利用二进制数的所有可能组合来表示一个值。因此,无论使用哪种按位运算,都不可能产生负零。那么这段文字是什么意思呢?
我认为这部分是指具有1的补码或带符号幅度的系统,该系统不支持负零,而是使用填充位或陷阱表示。它是否正确?