skip to content

🤔关于进制的思考

三个基本类型

  • int
  • float
  • char

总结

  • bit 二进制位

    计算机用来存储数据最基本的单位是电子管 有两种状态开启和关闭 即 0 和 1 这两种可能

    对应到计算机中的存储单位就是 bit

    nbit 可以表示 0 ~ 2^n - 1 这个区间的数

    二进制十进制
    00
    11
    102
    113
    1004
    1015
    1106
    1117
  • Byte

    在计算机中 8 个二进制位为一个字节 (B),最常用的单位。

    所以可以得出 1 个 Byte 可以表示一个 0 ~ 2^8 - 1 大小的数

  • 进制

    进制只是数字的一种表现形式

    也就是说 10 进制 322 进制的 100000 其实是一样的 只是展现方式的有所不同

  • int 与 char 的关系

    在 C 语言中 int 与 char 是可以无缝转换的

  • string 类型的的本质是个数组

    // 此时 a 是一个整形数字 即 int 类型
    let a = 100
    // 由于 int 和 char 是相同的那么我们可以找到 ASCII 码为 100 的 char 即 "d"
    let b = String.fromCharCode(a)
    // 然而把 a 从 int 转换成 string 得到 "100" 后其实得到的是一个装满 char 的一个数组
    // 每一个 char 都可以找到它的 int 类型
    let c = a.toString() // "100"
    c.charCodeAt(0) // 54
    c.charCodeAt(1) // 52
    
  • 同一个数由于进制不同而导致的显示方式不同并不影响他们相等

    但是一个 int 类型的 100 和一个 string 类型的 "100" 是完全不同的

    存储一个 int 的 100 用 1 Byte 又就可以了

    存储一个 string 类型的 "100" 需要用 3 Byte (1 个 char 需要 1 Byte 大小的空间去存储)

补充知识

计算机存储单位的换算关系

计算机存储单位一般用 bit、B、KB、MB、GB、TB、PB、EB、ZB、YB、BB、NB、DB …… 来表示,它们之间的关系是:

位 bit (比特)(Binary Digits):存放一位二进制数,即 0 或 1,最小的存储单位。[英文缩写:b(固定小写)]

字节 byte:8 个二进制位为一个字节(B),最常用的单位。

  • 1 Byte (B) = 8 bit
  • 1 Kilo Byte (KB) = 1024 B
  • 1 Mega Byte (MB) = 1024 KB
  • 1 Giga Byte (GB) = 1024 MB
  • 1 Tera Byte (TB) = 1024 GB
  • 1 Peta Byte (PB) = 1024 TB
  • 1 Exa Byte (EB) = 1024 PB
  • 1 Zetta Byte (ZB) = 1024 EB
  • 1 Yotta Byte (YB) = 1024 ZB
  • 1 Bronto Byte (BB) = 1024 YB
  • 1 Nona Byte (NB) = 1024 BB
  • 1 Dogga Byte (DB) = 1024 NB
  • 1 Corydon Byte (CB) = 1024 DB

JS 中整形转换成字节数组

const intToBytes = (value, len) => {
  let int8Arr = new Array(len)
  for (let i = 0; i < len; i++) {
    int8Arr[i] = Math.floor(value / Math.pow(256, i)) & 0xff
  }
  return int8Arr
}

JS 中 10 进制转任意进制

const divideByDec = (decNumber, base) => {
  let remArr = []
  let rem = 0
  while (decNumber > 0) {
    rem = Math.floor(decNumber % base)
    if (rem > 10) rem = String.fromCharCode(rem + 87)
    remArr.push(rem)
    decNumber = Math.floor(decNumber / base)
  }
  return remArr.reverse().join('')
}
// Math.floor() 方法返回小于等于x的最大整数。
// String.fromCharCode() 返回ASCII码对应的字符
Number.prototype.divideByDec = function (base) {
  let decNumber = this
  let remArr = []
  let rem = 0
  while (decNumber > 0) {
    rem = Math.floor(decNumber % base)
    if (rem > 10) rem = String.fromCharCode(rem + 87)
    remArr.unshift(rem)
    decNumber = Math.floor(decNumber / base)
  }
  return remArr.join('')
}