【问题标题】:Using chars into an int datatype在 int 数据类型中使用字符
【发布时间】:2023-03-06 18:48:01
【问题描述】:

使用 C,一个数组有 5 个内存空间

int call[5]

我试图弄清楚如何使用数组的前 3 个空格进行 base-36 转换(意味着 1K0 base-36 等于 base-10 中的 2040),其他 2 个空格将被填充数据(可能更多的整数)。

但是... 1K0 看起来真的像一个 int 吗? (对我来说,K 看起来像一个 char,理论上,char 应该足够 -127 到 127 用于使用 base-36 进行转换)

但是,如果我尝试使用 int 而不是 char 来执行此操作会发生什么?

是否有任何替代方法可以在第一个数组中使用 base-36 转换,只与内存中其余空间的整数混合

这有关系吗? (因为数组被声明为 int)

编辑:要清楚我只想知道我是否可以声明一个 int 数组并用字符填充它,如果我不能,我该如何实现?

【问题讨论】:

  • 我想提供一些额外的详细信息,说明您为什么要与 base 36 作为初学者作战,您在哪里需要它,以及是否需要对其进行数学运算或只是存储它。
  • 是的,您可以声明一个int 数组并用字符填充。
  • @Arheisel 基本上我需要存储大量信息并且我受内存限制,所以我正在寻找减少数字的替代方法,int8 是不够的,所以我首先想到的是使用非标准的高基转换
  • @GoatZero 尝试使用另一个基地时,您根本不会节省任何空间。只是说。

标签: c arrays types int


【解决方案1】:

我不确定您是否可以告诉编译器,您可以发出十六进制 (0x)、八进制 (o) 二进制 (b) 信号,但基数 36 很奇怪,不是标准的。

您始终可以创建一个函数(也可以将其嵌入到一个类中),将基数 ​​36 的字符串转换为 base10

我会在 C 方面尽力而为

int base10Number = 0
int base36StringLenght = strlen(base35String);
for( int i = base36StringLenght - 1; i <= 0; i--){ //count from the end of the string back
  char c = base36String[i];
  if(c <= '9'){
    c -= '0' //gives a 0 to 9 range
  }
  else{ //assuming that the string is perfect and has no extra characters is safe to just do this
    c = tolower(c); //first make sure it's lowercase
    c -= 'a' + 10 // this will make the letters start at 10 dec
  }
  base10Number += c * pow(36, base36StringLenght - 1 - i) // the power function specifies which 'wheel' you're turning (imagine an old analog odometer) and then turns the wheel c times, then adds it to the overall sum.
}

整个代码的工作原理是,从最后一个数字开始的每个数字都值得其基数为 10 的数字乘以 36 到其从最后一个位置的幂。 所以最后一个数字是 c * 36^0 这是一个,c*36^1 等等。如果 2 位于倒数第二个位置,则 2*10^1 如何等于 20。

希望其中一些对您有意义,并且不要忘记将您的 base36 数字设为字符串

编辑: 我看到了您对答案的编辑,简短的回答是肯定的,您完全可以这样做,这将浪费空间,因为您将始终未使用整个 3 个字节,您可以简单地制作一个 char 数组。此外,所有字符串函数都将要求您为它们提供一个 char 数组(您可以强制转换它),但如果您为每个数组空间存储一个数字,则 char 就可以了。如果您的数组是动态的和/或您需要对其进行一些数学运算,则基数 36 到基数 10 的转换将允许您进行数学运算并将整个数组吹成单个 int 或 float 类型。但是,如果您只是要存储它以便稍后显示它或以相同格式将其提供给另一个函数,则根本不需要转换。 (如果您要处理大量此类数字,并且需要将它们放入转换为 base10 的数据库中并存储在一个单独的数据库中,将节省大量空间)

PS:还编辑了代码以使用 ' ' 括起来的字符而不是 ascii 数字,感谢您的请求!

【讨论】:

  • 为什么使用数字 ASCII 码而不是'-封闭符号?
  • 没什么特别的原因,我的错,我只是习惯了
  • 我对你的回答速度感到惊讶,请允许我用我自己的话来理解:所以基本上你建议将其转换为 base-36,制作一个字符串,并插入每个字符将字符串转换为数组的前 3 个值,然后在需要时取出前 3 个值并将它们转换回 base-10?
  • 顺便说一句,我编译了代码,以修复几个拼写错误并使其运行,并编辑了您的答案以便它可以运行,但是我得到的输入 2040 并没有得到 1k0, 93456 是正确的(至少是十进制形式)wolframalpha.com/input/?i=2040_36,但是我期待它输出 1K0(我现在不确定这是什么基数)见unitconversion.org/numbers/base-10-o-base-36-conversion.html
  • 这里是在线编辑器上运行的代码onlinegdb.com/rk-TDoK_f
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-22
相关资源
最近更新 更多