打印无符号短整型数值

13
  unsigned short a;
  char temp[] = "70000";
  a = atoi(temp);
  printf("a: %d\n", a);

当我从 ASCII 转换为十进制时,输出结果是 a: 4464,但实际上应该是 a: 70000。有没有更好的方法可以进行转换?无符号短整型的范围是 0 到 65535。

2个回答

13

正如schnaader所说的,你可能遇到了溢出问题。

但是针对你关于输出无符号值的printf问题,你需要使用u修饰符(表示“无符号”)。在这种情况下,就像Jens在下面指出的那样,你需要使用%hu

printf("a: %hu\n", a);

虽然仅使用%u(即unsigned int而非unsigned short)也可能有效,因为当printfshort推送到堆栈时,它将被提升为int

但是,这仅在值70000适合您的平台上的unsigned short时才有效。


@Jens:谢谢。 h 格式说明符是否在 C 标准中定义?(不是 C++,也不是特定编译器。)我的记忆(有点模糊!)是,在像 printf 这样的可变参数情况下,short 值会被转换为 int 并推入堆栈。编辑:例如,我从这里得到了预期的输出(42, 60000, 42):http://pastie.org/1613793 gcc -Wall 没有给我任何警告(GCC 4.4.3)。但当然,这可能只是某个地方帮助了我,可能是特定于我的架构或编译器等等。 :-) - T.J. Crowder
1
是的,它是C99。如果unsigned short适合于它,则参数将被提升为int,否则为unsigned int。但这只是一个不同的事情,格式说明符告诉printf如何解释它接收到的int - Jens Gustedt

8
您正在回答这个问题。一个 unsigned short 的范围是0-65535,所以70000无法放入其中(2字节),请改用4字节的数据类型(unsigned int应该可以工作,您可以使用 sizeof 检查大小)。

1
这是我的计算机科学作业,我们需要使用无符号短整型数据类型。 - foo
5
@mateo:你无法用2个字节来存储70000,这是事实。如果作业要求你尝试,那么答案就是“我不能,老师你也不能”。但很可能作业并没有要求这样做,所以请再次阅读题目,并告诉我们确切的措辞,如果你想让我们回答。 - user395760
2
在这种情况下,你只能将70000存储在两个无符号短整型中,而不能只用一个。听起来确实很奇怪。 - schnaader

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接