使用%lu打印int类型 - C + XINU

时间:2012-08-25 07:24:55

标签: c casting printf implicit-conversion format-specifiers

我有一个给定的代码,在我看来该代码有问题: 我在XINU下编译。

接下来的变量是相关的:

unsigned long ularray[];
int num;
char str[100];

有一个函数返回int:

int func(int i)
{
    return ularray[i];
}

现在代码是这样的:

num = func(i);
sprintf(str, "number = %lu\n", num);
printf(str);

问题是我在使用%lu打印时得到大数字,这是不正确的。

如果我将%lu 更改为%d ,我会得到正确的数字。 例如:使用%lu我得到27654342,而%d得到26,后者是正确的;

给出了变量,给出了函数的声明,我写了正文但它必须返回int;

我的问题是:

  1. 我不熟悉'sprintf'可能有问题吗?

  2. 我将unsigned long分配给int然后用%lu打印int,是吗?

  3. 如何解决问题?

  4. 提前致谢。

    感谢大家的回答。 我只想提一下我在XINU下工作,我改变了文件编译的顺序和你知道的......它在%lu和%d上工作并显示相同的数字。

    我很清楚将'unsigned long'分配给int然后使用%lu打印是不正确的编码,可能会导致数据丢失。 但正如我所说,代码是给定的,我无法更改变量和打印命令。

    我没有错误或警告顺便说一句。 我不知道为什么更改编译顺序修复了问题,如果有人有想法,那么欢迎你加入。

    我要感谢所有试图帮助我的人。

4 个答案:

答案 0 :(得分:2)

1)误解一般是格式说明符

2)num是一个int - 因此,当%d是您要打印的内容时,int是正确的。

3)理想情况下

  • int func(int i)将为unsigned long func(size_t i)
  • int num将为unsigned long num
  • sprintf(str, "number = %d\n", num);将为sprintf(str, "number = %lu\n", num);
这样,就没有缩小和没有转换 - 在执行过程中将正确保留类型/值。

并且要迂腐,printf应为printf("%s", str);

如果您将警告级别提高,编译器会警告您某些事情。我已经编程很长时间了,我仍然把警告水平高得令人讨厌(根据某些人的标准)。

答案 1 :(得分:2)

  

我将unsigned long分配给int然后用%lu打印int,是吗?

不,这根本不正确。想一想吧! Printf尝试访问由传入的变量表示的内存,在你的情况下,unsigned long表示在比int更多的位上,因此当printf被告知要打印unsigned int时,它会读取你的实际int并读取一些其他内存可能是垃圾,因此是随机数。如果printf有一个完全提到unsigned long的原型,那么编译器可以执行隐式转换并用零填充剩余的不需要的内存,但由于情况并非如此,你必须执行以下任一解决方案:

一,显式转换你的变量:

printf("%lu", (unsigned long)i);

二,使用正确的格式说明符:

printf("%d", i);

此外,将unsigned long分配给int也存在问题 - 如果long包含太大的数字,那么它将不适合int并被截断。

答案 2 :(得分:0)

如果您有int,请使用%d(或%u表示无符号整数)。如果你有一个长的,请使用%ld(或%lu表示无符号长) 如果你告诉printf你给它一个很长但只传递一个int,你将打印随机垃圾。 (从技术上讲,这将是未定义的行为。)

如果int以某种方式“来自”很长时间并不重要。一旦你将它分配给更短的东西,额外的字节就会丢失。你只剩下一个int。

答案 3 :(得分:0)

  

我将unsigned long分配给int然后用%lu打印int,是吗?

不,我建议首先将转换为int,否则只使用int作为数组类型。存储更大的表示并且使用更小的表示似乎毫无意义。无论哪种方式,在您将变量的类型(技术上是编码)与格式的转换说明符正确配对之前,sprint结果将始终处于关闭状态。这意味着如果您传递无符号长整数,请使用%ul,如果它是int,请使用%i%d(区别在于%d 总是 base-10,%i可以使用其他说明符在其他基础上打印。

  

我该如何解决问题?

将您的func的返回值和num的编码更改为unsigned long

unsigned long ularray[];
unsigned long num;
char str[100];

unsigned long func(int i)
{
    return ularray[i];
}