当前位置: 首页 > 知识库问答 >
问题:

C程序,尽管使用相同的固定长度数据类型,但在不同的机器上产生不同的结果

岳浩宕
2023-03-14

我在试验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编译。

共有1个答案

裴焱
2023-03-14

如果您使用的是使用Microsoft不兼容CRT(非)标准库的Windows编译器,您可能会遇到此问题。即:VisualStudio或Mingw64/gcc。

我可以在Mingw/gcc上复制它。众所周知的一个问题是Microsoft CRT已损坏,例如,它不支持C99中引入的各种格式说明符。问题似乎在于scanf使用错误的格式说明符读取,因为在启用所有警告的情况下编译时,我会得到:

警告:未知转换类型字符'h'的格式[-Wform=]

%hh位于SCNu8的引擎盖下面,但是编译器只读取%h并停在那里。scanf调用实际上失败了。

您可以使用以下方法至少在明w中解压CRT库:

#define __USE_MINGW_ANSI_STDIO 1
#include <stdio.h>

当我把上面的代码添加到你的代码中时,我得到了1的第0位是: 1。没有上面的补丁,我得到了0的第0位是: 0

 类似资料:
  • 为什么用于取消引用传递给printf的指针的类型会影响输出,即使类型大小相同: 输出: 我希望最后两行都正确打印0x3ff0000000000000,即IEEE754双浮点中1.0的表示形式。

  • 这是代码: 如果我在我的机器()或这里()上尝试: 相反,这里(): 这是不同的。这是由于机器厄普西隆?还是编译器精度标志?还是不同的评估? 造成这种漂移的原因是什么?问题似乎出现在函数中(因为其他值似乎相同)。

  • 问题内容: 我在这里已经读到,在Java中,具有相同名称但不同类型的两个变量可以在同一范围内共存。我的意思是这个 但是所有的Java IDE都不允许这样的代码。我想知道这样的代码在语法上是否正确,或者只是IDE不允许这样的代码防止歧义。 无论如何,这是网站的摘录 “如果幸运的话,您也许能够重新编译Jad的输出。 但是,Java VM对于变量命名的规则比Java语言本身更为宽松。例如,一个有效的类文

  • 但所有java IDE都不允许这样的代码。我想知道这样的代码在语法上是否真的正确,或者只是IDE不允许这样的代码来防止歧义。 总之,这里是从网站上摘录的 “如果你幸运的话,你也许可以重新编译JAD的输出。然而,Java VM对变量命名的规则比Java语言本身更宽松。例如,一个有效的类文件可以有几个名为'a'的变量,只要它们有不同的类型。如果你反编译这样的类,你得到的源代码将是无效的。 JAD通常会

  • 我有一个需要分解的spark数据帧,格式如下。我检查其他解决方案,比如这个。但是,在我的例子中,之前的之后的 或“after”。 我可以在两个单独的爆炸中执行此操作,其中我在每个爆炸中创建列,然后创建。 但是,我想知道是否有更优雅的方式来做到这一点。谢谢

  • 因此,我正在创建一个用户API,并尝试在登录前调用getUserByEmail()。我的问题是,我得到了一个不明确的处理程序方法映射为HTTP路径错误。 我知道我的问题与我有一个相同但参数类型不同的GET有关。任何帮助都将不胜感激!