C程序,尽管使用相同的固定长度数据类型,但在不同的机器上产生不同的结果 [英] C program yielding different results on different machines despite using the same fixed length data types
本文介绍了C程序,尽管使用相同的固定长度数据类型,但在不同的机器上产生不同的结果的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我在试验inttype时制作的简单程序。h:
#include <stdio.h>
#include <stdbool.h>
#include <inttypes.h>
bool get_bit(uint32_t x, uint8_t n) {
x >>= n;
return x & 1;
}
int main() {
uint32_t x;
uint8_t n;
printf ("Enter x: ");
scanf("%"SCNu32, &x);
printf ("Enter n: ");
scanf("%"SCNu8, &n);
printf("The %"PRIu8"th bit of %"PRIu32" is: %d", n, x, get_bit(x, n));
return 0;
}
在我的手机(64位八核ARN LTE Soc Android 10)上工作正常:
Enter x: 1
Enter n: 0
The 0th bit of 1 is: 1
但在我的计算机(64位x86 Windows 10)上收到:
Enter x: 1
Enter n: 0
The 0th bit of 0 is: 0
将bool更改为uint8_t不会影响它。
编辑:我试过用MINGW-W64、GCC C99、C17编译。
推荐答案
如果您使用的是使用微软不兼容的CRT(非)标准库的Windows编译器,您可能会遇到此问题。即:visual Studio或Mingw64/GCC。
我可以在Mingw/GCC上转载。这是一个众所周知的问题,Microsoft CRT坏了,例如不支持C99中引入的各种格式说明符。问题似乎在于scanf
使用错误的格式说明符进行读取,因为在启用所有警告的情况下编译时,我得到:
警告:格式[-Wformat=]
中的未知转换类型字符‘h’
%hh
位于SCNu8
的幕后,但是编译器只读取到%h
,然后停止。scanf
调用实际失败。
您至少可以使用以下命令在Mingw中解压CRT库:
#define __USE_MINGW_ANSI_STDIO 1
#include <stdio.h>
当我将上述内容添加到您的代码中时,我得到The 0th bit of 1 is: 1
。
如果没有上面的补丁,我会得到The 0th bit of 0 is: 0
这篇关于C程序,尽管使用相同的固定长度数据类型,但在不同的机器上产生不同的结果的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文