进制表示法
概述
参考:
对于整数,有四种表示方式: 二进制: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
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
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
前缀。这很好,因为
- 现在,整数常量始终由单个标记组成,
- 解析器仍然可以立即告诉它有一个常数,
- 解析器可以立即告诉基准(
0
两个基准都相同), - 从数学上讲是理智的(
00005 == 05
), - 不需要珍贵的特殊字符(如中的
#123
)。
从 B 创建 C 时,就需要使用十六进制数字(PDP-11 具有 16 位字),并且以上所有点仍然有效。由于其他机器仍需要八进制数,0x
因此可以任意选择八进制数(00
可能被排除在尴尬之外)。
C#是 C 的后代,因此它继承了语法。 — Řrřola source
我不认为0x
在00
为偏好/尴尬。00
会破坏现有代码。0010
如八进制一样8
,而0010
如十六进制一样16
。他们不能使用任何数字作为第二位数字指示符(8
或除外9
,也不具有与十六进制有关的任何意义),因此必须输入字母。剩下的就是0h
或0x
(H e X十进制)。从这一点来看,似乎真的回到了偏好。
— GManNickG 2013 年
相关:stackoverflow.com/questions/18987911/…和stackoverflow.com/questions/11483216/… — Řrřola
0
多年来,为八进制使用前缀已经引起了很多问题。尤其是在像英国这样的国家中,电话号码以开头0
。Javascript 和许多其他语言会将它们解析为八进制,在存储之前先处理数字。为了助兴,一个流行的数据库产品将_悄无声息_,如果数字包含在切换回十进制解析8
或9
。
— 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!
有趣。我想他们可以使用前导 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
它是一个前缀,表示数字以十六进制表示,而不是以其他基数表示。C 编程语言使用它来告诉编译器。
例:
0x6400
转换为 6*16^3 + 4*16^2 + 0*16^1 +0*16^0 = 25600.
编译器读取时0x6400
,它借助0x 术语了解数字为十六进制。通常我们可以通过(6400)16 或(6400)8 来理解或其他任何东西。
对于二进制文件,它将是:0b00000001
从 C ++ 14 开始,二进制文字仅在 C ++中受支持,而在 C 中则完全不支持。 — Ruslan
这不能解释_原因_。特别是为什么您不能将第一个示例编写为x6400
?将x
仍然可以用来推断十六进制。
— 亚伦·弗兰克
前面的 0 表示以 2、8 或 16 为基数的数字。 在我看来,选择 0x 表示十六进制是因为’x’听起来像十六进制。 只是我的意见,但我认为这是有道理的。 美好的一天! — 约翰尼·洛 source
反馈
此页是否对你有帮助?
Glad to hear it! Please tell us how we can improve.
Sorry to hear that. Please tell us how we can improve.