我只是在学习二进制和字节。据我所知,8位组成一个字节,一个字节可以有256种可能性。我很困惑的是:
byte[] b = new byte[] { 85, 85, 67, 75 };
85或以上任何数字与二进制有什么关系。我脑子里根本没有完全点击的东西。
答案 0 :(得分:12)
Binary是计算机内存储内容的方式。 0和0,开关,真假,是否存在电流。 This Wikipedia article给予它相当彻底的治疗。
在您的示例中,类似“85”的表示形式是字节格式化,以方便我们作为人类读者。它可以用十六进制(基数16)格式化为“55”,八进制格式(基数8)格式为“125”,二进制格式为“1010101”,如果你是如此倾向,甚至格式为“11”。一切都意味着同样的事情。
答案 1 :(得分:4)
85只是一个数字的十进制(即“基数10”)positional notation。这意味着:
8 * 10 ^ 1 + 5 * 10 ^ 0
= 8 * 10 + 5 * 1
= 80 + 5
= 85
但是,您可以选择任何基数来表示数字。我们人类有10个手指,这是日常使用中“基础10”系统的可能起源,但是没有办法在计算机的物理电路中表示10个不同的数字。该电路仅了解电子的缺乏与电子的存在 - 即仅两位数,因此是二元系统。
所以,虽然你可以在程序的源代码中写入十进制85(为了让它对人类更自然),它最终会在计算机中表示为二进制1010101,等于......
1 * 2 ^ 6 + 0 * 2 ^ 5 + 1 * 2 ^ 4 + 0 * 2 ^ 3 + 1 * 2 ^ 2 + 0 * 2 ^ 1 + 1 * 2 ^ 0
= 1 * 64 + 0 * 32 + 1 * 16 + 0 * 8 + 1 * 4 + 0 * 2 + 1 * 1
= 64 + 16 + 4 + 1
= 85
有时,使用与二进制“对齐”的数字系统很方便,例如octal(一个八进制数字恰好是3个二进制数字)或hexadecimal(一个十六进制数字正好4个二进制数字)。
重要的是,所有这些系统最终都会在计算机中表示为二进制。
在旁注:“十六进制”曾经是“ sexa -decimal”,但显然冒犯了一些清教徒的敏感性;)
答案 2 :(得分:3)
C#中的byte只是一个8位整数值。在上面,你在数组中表示4个数字 - 这与使用int时的数字没有什么不同,除了数字占内存总空间的1/4。
它实际上与“二进制”无关 - 除了它是用于二进制数据的最常见表示。这是因为大多数系统一次只有一个“字节”,这是一个8位数据块。因此,如果您正在使用原始二进制信息,那么字节是表示此数据的常用方法。
BitConverter类具有从字节数组转到其他类型并返回的例程。例如,它可以take 4 bytes and turn it into an Int32重视或反过来。请记住 - 存储的所有数据都只是内存 - 您只需按特定顺序保存一系列位(1和0),系统将以特定方式解释此数据。
答案 3 :(得分:3)
这些只是数字。它们与二进制本身无关。但是,如果您这样选择的话,可以用二进制编写它们 - 例如,基数2中的75 = 01001011。
此处的byte
只是一种数据类型,可以容纳256个可能值中的一个。通常,这被解释为0到255之间的数字,或8个二进制数字(即,8个ON / OFF值)。这只是看待同一件事的两种方式。
答案 4 :(得分:3)
该语句声明了一个字节数组,并为其分配了4个元素 - 每个元素的大小都是单个字节(理论上!)。存储在该数组中的实际值 - 85,86,67,75是每个可以放入单个字节的值。在您的代码示例中,这些值以十进制形式表示。一旦你的代码被翻译成可执行的形式,你的计算机最终会看到这些值的二进制表示,从寄存器到注册,推送,弹出和累积等等。
你可以代表你的源中其他基础的值 - 例如十六进制或16,它更接近金属而非十进制,并相应地允许你的思维过程在人类之间轻松移动表示和你的代码实际上说的是什么,因为在十六进制和二进制之间几乎没有实际的数学思想;另一个很好的例子是八进制。
或者您可以这样思考:使用与您正在做的事情最相关的基础来代表代码中的值。如果您正在将权限或颜色值进行OR运算,则为十六进制或八进制;如果您计算支票账户的利息,那么显而易见的选择是十进制。
现在,对于您的特定代码段 - 如果您正在处理单个字符或将原始内容写入块设备,那么字节数组可能就好了 - 但是,当您与编译器成为一个时,您的大脑可能会最终将hex视为易于处理的表示。
答案 5 :(得分:0)
数组中的每个数字都小于256.它们被转换为二进制的字节。这只是它们的十进制表示。