【问题标题】:In C is there a way to set a maximum width for an integer output?在 C 中有没有办法为整数输出设置最大宽度?
【发布时间】:2015-06-30 20:59:59
【问题描述】:

我正在按顺序打印十六进制数字,以便为 C 中的汇编程序制作操作码。除了位移为负时,我拥有一切完美的东西。现在我只有 3 个可用于置换的空间,当它是 -11(base 10) 时,我将其转换并得到 fffffff5 作为我的答案。我想限制这一点,以便只显示ff5。有没有办法做到这一点?由于限制打印正数时,数字永远不会大于7FF,所以我在那里没有问题。但是对于负数,它总是会打印 8 个十六进制数字,我只想要最右边的 3 个数字,有没有办法做到这一点?

【问题讨论】:

  • 但是你知道0xfffffff5和0xff5是不同的值吗?
  • @CarlNorum 是的,这就是为什么在具有 32 位变量的 C 代码中需要特殊处理(再次读入时)。这就是我写这篇文章的原因,不知何故,如果唯一关心的是空格,我怀疑 OP 是否意识到这一点。
  • 我认为他的意思是在他的指令编码中可用 3 个十六进制位值。也就是位移是一个12位的相对偏移量。
  • 你是对的。我只允许在指令编码中使用 3 个十六进制位置值。我的电脑相对寻址的范围是 -2048 - 2047,只有 3 个十六进制值来表示数字。

标签: c io hex negative-number


【解决方案1】:

您可以在打印前截断:

unsigned int x = -11;
printf("%03x\n", x & 0xfff);

示例输出:

$ ./example 
ff5

【讨论】:

  • 嘿,谢谢。我真的很感激它完美地修复了它。有没有你从中得到的网页?我一直在寻找一种截断整数的方法,但在任何地方都找不到!
【解决方案2】:

按照@Carl Norumx & 0xfff 的建议,将值限制在-0x800 到0x7FF 的范围内。

理论上printf() 还需要控制语言环境,这实际上可以打印出更多内容,但实际上并不需要担心。当然可以使用代码。

char buf[4];
buf[0] = 0;
snprintf(buf, sizeof buf, "%03x", x & 0xFFF);
fputs(buf, stdout);

但这有点belt and suspenders

【讨论】:

  • @Carl Norum 如果你的意思是讨厌的额外'F' - 已修复。
  • 是的 - 就是这样。我想我错过了起初发生的事情。现在我明白了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-10
  • 1970-01-01
  • 2020-06-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-30
  • 2011-06-08
相关资源
最近更新 更多