进制表示法

概述

参考:

对于整数,有四种表示方式:   二进制:0,1 ,满 2 进 1.以 0b 或 0B 开头。   十进制:0-9 ,满 10 进 1.   八进制:0-7 ,满 8 进 1. 以数字 0 开头表示。   十六进制:0-9 及 A-F,满 16 进 1. 以 0x 或 0X 开头表示。此处的 A-F 不区分大小写。     如:0x21AF +1= 0X21B0

0123456789101112131415
0123456789ABCDEF

1.原码、反码、补码

所有数字在计算机底层都以二进制形式存在。

计算机以补码的形式保存所有的整数。

正数的原码、反码、补码都相同

负数的补码是其反码加 1。

原码:直接将一个数值换成二进制数。

反码:是对原码按位取反,只是最高位(符号位)确定为 1。

Java 整数常量默认是 int 类型,当用二进制定义整数时,其第 32 位是符号位;当是 long 类型时,二进制默认占 64 位,第 64 位是符号位

2.进制间转化   十进制二进制互转     二进制转成十进制   乘以 2 的幂数     十进制转成二进制   除以 2 取余数 二进制八进制互转 二进制十六进制互转 十进制八进制互转

十进制十六进制互转

为什么十六进制数字以 0x 开头?

https://qastack.cn/programming/2670639/why-are-hexadecimal-numbers-prefixed-with-0x

为什么十六进制数字以前缀0x?我了解前缀的用法,但不了解0x选择为什么的意义。

现在,我意识到标题和文本提出了两个完全不同的问题。大多数答复都集中在标题中的问题上。文本中问题的答案很简单:“它没有任何意义,它只是一个前缀,告诉编译器整数以十六进制表示”。— Andreas Rejbrand

为了学究,可能还会以两种不同的方式解释标题中的问题:1)“为什么十六进制数字以 0x 为前缀,而不是其他任何前缀或指示符?” 2)“为什么在输入十六进制数字时需要使用前缀?即使没有前缀,编译器肯定会识别 58A 为十六进制数字吗?” 对问题的第二种解释的答案很简单。“ 123”也是十六进制数。— Andreas Rejbrand

Answers

简单地说:在0告诉它在处理一个恒定的(而不是一个标识符/保留字)的解析器。仍然需要指定数字基数:x是任意选择。

长话短说:在 60 年代,流行的编程数字系统是十进制和_八进制_ -大型机每字节有 12、24 或 36 位,可以很好地将其除以 3 = log2(8)。

BCPL 语言将语法8 1234用于八进制数字。当 Ken Thompson 从 BCPL 创建 B 时,他改用了0前缀。这很好,因为

  1. 现在,整数常量始终由单个标记组成,
  2. 解析器仍然可以立即告诉它有一个常数,
  3. 解析器可以立即告诉基准(0两个基准都相同),
  4. 从数学上讲是理智的(00005 == 05),
  5. 不需要珍贵的特殊字符(如中的#123)。

从 B 创建 C 时,就需要使用十六进制数字(PDP-11 具有 16 位字),并且以上所有点仍然有效。由于其他机器仍需要八进制数,0x因此可以任意选择八进制数(00可能被排除在尴尬之外)。

C#是 C 的后代,因此它继承了语法。 — Řrřola source


我不认为0x00为偏好/尴尬。00会破坏现有代码。0010如八进制一样8,而0010如十六进制一样16。他们不能使用任何数字作为第二位数字指示符(8或除外9,也不具有与十六进制有关的任何意义),因此必须输入字母。剩下的就是0h0xH e X十进制)。从这一点来看,似乎真的回到了偏好。 — GManNickG 2013 年


相关:stackoverflow.com/questions/18987911/…stackoverflow.com/questions/11483216/…Řrřola


0多年来,为八进制使用前缀已经引起了很多问题。尤其是在像英国这样的国家中,电话号码以开头0。Javascript 和许多其他语言会将它们解析为八进制,在存储之前先处理数字。为了助兴,一个流行的数据库产品将_悄无声息_,如果数字包含在切换回十进制解析89。 — 2015 年


12、24 和 36 也可以被 4 整除,那么为什么他们不想到十六进制呢? — phuclv


@LưuVĩnhPhúc 可能是因为十六进制不是很重要。大多数时间的硬件,软件和文档都更适合八进制。BCPL 首先在36 位 IBM 7094 上实现,其指令格式分为两个 3 位部分和 2 个 15 位部分;6 位字符;和八进制文档。B 的早期实现是在 PDP-7(18 位)和 Honeywell GE-945(36 位,但具有 18 位寻址,并支持 6 和 9 位字节)上实现的。16 位 PDP-11 在 B 之后问世,因此对 B 的设计影响不大。 — 8bittree ‘17


注意:我不知道正确的答案,但以下只是我个人的猜测! 如前所述,数字前的 0 表示它是八进制的:

04524 // octal, leading 0

想象一下,需要提出一个表示十六进制数字的系统,并注意我们正在 C 风格的环境中工作。以 h 结尾像汇编怎么样?不幸的是,您不能-它会允许您制作作为有效标识符的令牌(例如,您可以将变量命名为同一名称),这会带来一些令人讨厌的歧义。

8000h // hex
FF00h // oops - valid identifier!  Hex or a variable or type named FF00h?

出于相同的原因,您不能以字符开头:

xFF00 // also valid identifier

使用散列可能被抛弃了,因为它与预处理器冲突:

#define ...
#FF00 // invalid preprocessor token?

最后,无论出于何种原因,他们决定将 x 放在前导 0 后面以表示十六进制。它是明确的,因为它仍以数字字符开头,因此不能成为有效的标识符,并且可能基于前导 0 的八进制约定。

0xFF00 // definitely not an identifier!

阿什莉·布莱恩 source


有趣。我想他们可以使用前导 0 和后跟 h 表示十六进制。尾随的 h 可能已与类型说明符后缀混淆,例如 0xFF00l 与 0FF00hl — zdan 2010 年


该论点暗示使用前导零表示八进制数早于使用十六进制“ 0x”前缀。这是真的? — Andreas Rejbrand


它们不是同时被发明的吗?为什么会有一个而不是另一个呢? — AshleysBrain,2010 年


AshleysBrain 看到@Řrřola 的回答,说明为什么同时可能存在八进制而不是十六进制。 — 2012 年


@zdan 他们很久以前就使用过它。在 x86 Intel 汇编中,如果十六进制文字以字符开头,则必须始终以 0 为前缀。例如0xFFAB1234必须写为0FFAB1234h。我还记得我年轻时在 Pascal 的嵌入式 asm 中获得的代码 stackoverflow.com/q/11733731/995714

phuclv 2015 年


它是一个前缀,表示数字以十六进制表示,而不是以其他基数表示。C 编程语言使用它来告诉编译器。

例:

0x6400转换为 6*16^3 + 4*16^2 + 0*16^1 +0*16^0 = 25600. 编译器读取时0x6400,它借助0x 术语了解数字为十六进制。通常我们可以通过(6400)16 或(6400)8 来理解或其他任何东西。

对于二进制文件,它将是:0b00000001

洛伊拉 source


从 C ++ 14 开始,二进制文字仅在 C ++中受支持,而在 C 中则完全不支持。 — Ruslan


这不能解释_原因_。特别是为什么您不能将第一个示例编写为x6400?将x仍然可以用来推断十六进制。 — 亚伦·弗兰克


前面的 0 表示以 2、8 或 16 为基数的数字。 在我看来,选择 0x 表示十六进制是因为’x’听起来像十六进制。 只是我的意见,但我认为这是有道理的。 美好的一天! — 约翰尼·洛 source


最后修改 June 12, 2024: data type (a103a962)