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

我有一个给定的代码,在我看来这个代码有问题:我在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,而%di得到26,后者是正确的;

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

我的问题是:

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

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

  3. 我该如何解决这个问题?

提前致谢。

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

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

我没有错误或警告。 我不知道为什么更改编译顺序修复了问题,如果有人有想法你更欢迎分享。

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

我将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并被截断。

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

2)num是一个int – 因此,当你想要打印int时, %d是正确的。

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);

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

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

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

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

不,我建议不要先转换为int,否则只使用int作为数组类型。 存储更大的表示并且仅使用更小的表示似乎毫无意义。 无论哪种方式,sprint结果将始终关闭,直到您将变量的类型(技术上的编码 )与格式的转换说明符正确配对。 这意味着如果你传递一个unsigned long,使用%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]; }