为什么大多数语言不允许二进制数?

use*_*886 17 language-agnostic binary numbers

为什么大多数计算机编程语言都不允许二进制数用作十进制或十六进制?

  • 在VB.NET中,您可以编写十六进制数字,如&H4
  • 在C中你可以写一个十六进制数字,如0x04

为什么不允许二进制数?

  • &B010101
  • 0y1010

奖励积分!...什么语言允许二进制数?


编辑

哇! - 因此大多数人认为这是因为简洁和可怜的旧"波浪"认为这是由于二进制表示的技术方面.

phi*_*hag 33

因为十六进制(和很少八进制)文字更紧凑,使用它们的人通常可以比解密二进制数更快地在十六进制和二进制之间进行转换.

Python 2.6+允许二进制文字,Ruby和Java 7也是如此,您可以使用下划线使字节边界变得明显.例如,十六进制值0x1b2a现在可以写为0b00011011_00101010.


Mot*_*tti 10

在C++ 0x中,用户定义的文字将支持二进制数,我不确定它是否会成为标准的一部分,但最坏的情况是你可以自己启用它

int operator "" _B(int i);

assert( 1010_B == 10);
Run Code Online (Sandbox Code Playgroud)


小智 8

为了使位表示有意义,您需要知道如何解释它.您需要指定您正在使用的二进制数的类型(有符号/无符号,二进制补码,一对一补,有符号幅度).

我曾经使用过的唯一支持二进制数的语言是硬件描述语言(Verilog,VHDL等).它们都有严格(通常是令人困惑的)定义,如何处理以二进制形式输入的数字.

  • 我不明白.什么是十六进制数,如果不是二进制序列?这一切都在解释中.试试这个:定义一个int`0xFFFFFFFF`(在一台32位机器上),然后将`printf`定义为`%d`,然后将它转换为`unsigned int`和`printf` it`%u`.两种方式都是相同的二进制,但由于解释它产生不同的数字. (12认同)
  • 定义数字与其存储方式无关.**1010**是有效的基数为2的数字,就像**AA**是有效的基数为16的数字而**251**是有效的基数为10的数字.事实上,计算机实际上并没有将两个"A"或"251"放在某个寄存器中并不重要,就像**1010**的内部表示实际上是"1010"一样无关紧要. .现在,如果你使用数字进行位掩码,它可能会有所不同,但问题不在于:它是关于像其他数字一样使用它们. (7认同)
  • 哇,有人知道他们在谈论什么!好极了! (3认同)
  • 呃?怎么可能?我认为二进制常量只能指定位,并且解释取决于您尝试对该值执行的操作. (3认同)

J.J*_*.J. 6

perldoc perlnumber:

NAME
   perlnumber - semantics of numbers and numeric operations in Perl

SYNOPSIS
       $n = 1234;              # decimal integer
       $n = 0b1110011;         # binary integer
       $n = 01234;             # octal integer
       $n = 0x1234;            # hexadecimal integer
       $n = 12.34e-56;         # exponential notation
       $n = "-12.34e56";       # number specified as a string
       $n = "1234";            # number specified as a string
Run Code Online (Sandbox Code Playgroud)


Sea*_*ght 5

稍微偏离主题,但较新版本的GCC添加了一个允许二进制文字的C扩展.因此,如果您只使用GCC进行编译,则可以使用它们.文件在这里.


And*_*kov 2

十六进制和八进制只是编写二进制的较短方法。您真的希望在代码中定义一个 64 字符的长常量吗?

  • 嗯,如果更清楚的话,还有待商榷:-) 我们仍然使用二进制字段,但我们倾向于在 VB.NET 中使用这样的枚举: Enum UserFlags AllowRed = 2^0 AllowGreen = 2^1 End Enum 允许您执行 MyFlags 之类的操作= 允许红色 + 允许绿色 (2认同)