【问题标题】:Printing last 5 digits in C (Octal base) [closed]用 C(八进制)打印最后 5 位数字[关闭]
【发布时间】:2020-07-09 04:11:07
【问题描述】:

我想知道如何在 C 编程语言中只打印八进制数的最后 5 位?

棘手的部分:该数字在定义中是无符号的,因此经过一些程序后它会输出类似 3777777464 的内容。我要打印的只是 77464。

我试图在 C 格式指南中四处寻找,但我只发现了如何编写前 5 个数字/字符,而不是关于提到的棘手部分的最后 5 个。

只需要在输出中显示(文件中的printf/fprintf)。

编辑并强调:代码太长,这里不放,它由许多c文件和头文件组成。为了简洁:我需要 printf("%05o\n",arr[i]);仅打印最后 5 位数字。它打印出类似 3777777464 的内容。数字是正确的,我只需要最后 5 位数字

非常感谢你帮助我

【问题讨论】:

  • "经过一些程序后,它会输出类似 3777777464 的内容" --> 发布该代码。
  • 什么程序?
  • 代码太长,这里就不贴了,里面有很多c文件和头文件。为了简洁:我需要 printf("%05o\n",arr[i]);仅打印最后 5 位数字。它打印出类似 3777777464 的内容。数字是正确的,我只需要最后 5 位数字
  • 所以使用提供的代码 chux。你用过吗?结果是什么?你对结果满意吗?它没有回答你的问题吗? i need printf("%05o\n",arr[i]); - arr 是什么? i 是什么?

标签: c printf octal


【解决方案1】:

仅打印数字的最后 5(八进制)数字

通过与掩码 077777 进行与运算导出最后 5 个八进制数字。

#define MASK_LAST_5_OCTAL_DIGITS 077777u

//       vv print at least 5 characters, pad with 0 as needed 
printf("%05o\n", (unsigned) (number & MASK_LAST_5_OCTAL_DIGITS));

【讨论】:

  • 您能看看更新后的问题吗?如果您能帮助克服这个问题,那将有很大帮助
  • 由于 unsigned int 转换,即使在 %05o 格式化之后,我也会得到类似 3777777 的内容。
  • @newB 真的需要看看你的代码。
【解决方案2】:

使用基于基数的模算术,例如从十进制基数 (base-10) 中提取最后 5 位数字,您将使用模 10^5,即number % 10u*10*10*10*10。

八进制或base-8 类似,您可以使用number% 8u*8*8*8*8。 (一个无符号常量以避免整数溢出)

另一种方法是将数字转换为字符串并提取最后 5 个字符,考虑到位数大于 5 且采用八进制/base-8 系统。 (snprintf 和 o 格式说明符是一个选项)

【讨论】:

  • 从未听说过八进制文字?
  • 以0为前缀的八进制数,是吗?还是您指的是在我的回答中使用%o?
  • @thebusybee C 定义了八进制常量,但不定义八进制文字。
  • 8*8*8*8*8 很好地自我解释。 2个注意事项:使用16位int(在嵌入式占有者中常见),8*8*8*8*8是int溢出。由于 OP 可能使用负数,最好使用像 8u*8*8*8*8 这样的 unsigned 常量(它也不会溢出)。使用int %(8*8*8*8*8),结果可以是 -32767 到 32767 - 即使是 32 位数学
  • 是的,它超过了限制 1,即 2^(3*5),我在这里给出了一个包含溢出的答案 stackoverflow.com/questions/60226543/… 但我在这里完全忘记了......让我意识到我应该考虑所有情况。再次感谢。
猜你喜欢
  • 2014-04-20
  • 2017-08-30
  • 2018-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-25
  • 1970-01-01
相关资源
最近更新 更多