这很可能是任何人都会问的最愚蠢的问题,但不管我希望我能找到一个明确的答案.
我的问题是 - 整数存储在计算机内存中怎么样?
在c#中,整数的大小为32位.MSDN说我们可以在整数变量中存储-2,147,483,648到2,147,483,647的数字.
根据我的理解,一个位只能存储2个值,即0和1.如果我只能存储0或1,我怎么能在一个位内存储2到9的数字?
更确切地说,我说这个代码int x = 5; 这将如何在内存中表示,或者换句话说如何将5转换为0和1,它背后的惯例是什么?
我有一个控件,里面有一个字节数组.
偶尔会有两个字节告诉我有关数组中未来项目数量的一些信息.
举个例子,我可以:
... ... Item [4] = 7 Item [5] = 0 ... ...
这个值显然是7.
但是这个怎么样?
... ... Item [4] = 0 Item [5] = 7 ... ...
关于什么等于(作为普通int)的任何想法?
我去二进制,并认为它可能是11100000000等于1792.但我不知道它是否真的有效(即它是否使用整个8项的字节).
有没有办法通过测试来了解这一点?
注意:我使用的是C#3.0和visual studio 2008
我需要将二进制补码格式的字节转换为正整数字节.范围-128到127映射到0到255.
Examples: -128 (10000000) -> 0 , 127 (01111111) -> 255, etc.
Run Code Online (Sandbox Code Playgroud)
编辑为了消除混淆,输入字节(当然)是0到255范围内的无符号整数.但它表示使用二进制补码格式在-128到127范围内的有符号整数.例如,输入字节值128(二进制10000000)实际上表示-128.
EXTRA EDIT Alrighty,假设我们有以下字节流0,255,254,1,127.在二进制补码格式中,它表示0,-1,-2,1,127.这需要钳位到0到255范围.有关更多信息,请查看这篇难以找到的文章:两个补充
我很难理解这段代码的工作方式和原因.我在这个任务中的合作伙伴完成了这一部分,我无法得到他,以了解它的工作原理和原因.我已经尝试了一些不同的东西来理解它,但任何帮助将非常感激.此代码使用2的补码和32位表示.
/*
* fitsBits - return 1 if x can be represented as an
* n-bit, two's complement integer.
* 1 <= n <= 32
* Examples: fitsBits(5,3) = 0, fitsBits(-4,3) = 1
* Legal ops: ! ~ & ^ | + << >>
* Max ops: 15
* Rating: 2
*/
int fitsBits(int x, int n) {
int r, c;
c = 33 + ~n;
r = !(((x << c)>>c)^x);
return r;
}
Run Code Online (Sandbox Code Playgroud) c bit-manipulation bit-shift bitwise-operators twos-complement
在2的补码中,0-127表示为00000000到01111111.在负数的情况下,我们反转无符号表示中的所有位并加1以得到2的补码.
(参考:http://en.wikipedia.org/wiki/Signed_number_representations#Two.27s_complement)
因此,2的补码中的-1将是:
unsigned 1 = 00000001 invert all bits = 11111110 add 1 = 11111111
但对于-128,如果我们遵循相同的步骤:
unsigned 128 = 10000000 invert all bits= 01111111 add 1= 10000000
所以-128和128在2的补码表示法中具有相同的表示形式?为什么8位的2的补码范围不是-127到128?简而言之,为什么-128优先于使用相同位数表示无符号128?
我在代码库中看到^ 0.
例:
type stat struct {
...
min int64
...
}
newStat := stat{min: ^0}
Run Code Online (Sandbox Code Playgroud)
^ 0是什么意思?
C ++ 20将指定带符号整数类型必须使用二进制补码。鉴于(实际上?)每个实现当前都使用二进制补码,这似乎不是一个很大的变化。
但是我想知道这种改变是否会将某些“未定义的行为”转变为“实现定义”甚至“定义”。
考虑绝对值函数std::abs(int)及其一些重载。C ++标准通过引用C标准来包括此功能,该标准表示如果无法表示结果,则行为未定义。
用二进制补码时,没有与之相对应的正数INT_MIN:
abs(INT_MIN) == -INT_MIN == undefined behavior
Run Code Online (Sandbox Code Playgroud)
在符号幅度表示中,有:
-INT_MIN == INT_MAX
Run Code Online (Sandbox Code Playgroud)
因此,abs()留下一些未定义的行为似乎是合理的。
一旦需要二进制补码,abs(INT_MIN)就可以完全指定行为,或者至少定义实现,这似乎是有意义的,而没有任何向后兼容的问题。但我看不到有任何建议的改变。
我看到的唯一缺点是C ++标准将需要abs()明确指定,而不是引用C标准的abs()。(据我所知,C并不要求补码。)
这是否只是委员会的优先事项?还是有理由不利用两国补编任务规定所提供的简化和确定性?
我使用2'补码来表示二进制形式的负数
案例1:数字-5
根据2'补充技术:
将5转换为二进制形式:
00000101然后翻转位
11111010,然后加1
00000001
Run Code Online (Sandbox Code Playgroud)
=>结果: 11111011
为了确保这是正确的,我重新计算到十进制:
-128 + 64 + 32 + 16 + 8 + 2 + 1 = -5
Run Code Online (Sandbox Code Playgroud)
案例2:数字-240
采取相同的步骤:
11110000
00001111
00000001
00010000 => recalculate this I got 16, not -240
Run Code Online (Sandbox Code Playgroud)
我误会了什么?
自从我上次在位和字节级别进行编程以来,已经很长时间了,并且想要确认那些日子我似乎记得的东西:
假设我有两个相等长度的整数(1,2,4,8个字节;无所谓),我将它们加起来:如果它们是有符号或无符号的,则总和的逐位结果是否不同.换句话说:无论它们是有符号整数还是无符号整数,这些位最终都是相同的吗?
我的直觉和脆弱的记忆告诉我他们会,但我只想确认一下.谢谢.
我使用-1作为返回类型为size_t(无符号类型)的函数的标志值.
我一开始并没有注意到它,特别是因为它没有导致我的代码中的任何错误(我用x == -1,而不是x <0来检查它).
是否有任何微妙的原因我不应该留下它?什么时候这可能出乎意料?这是常用的吗?
ptrdiff_t不太常见,输入时间较长,而且无论如何它都不是合适的类型,因为函数会将索引返回到数组中.