C程序,尽管使用相同的固定长度数据类型,但在不同的机器上产生不同的结果 [英] C program yielding different results on different machines despite using the same fixed length data types

查看:28
本文介绍了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屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆