【问题标题】:Difference in fRead methodsfRead 方法的差异
【发布时间】:2020-10-09 21:33:37
【问题描述】:

我正在审查一个从二进制文件中读取数据的旧 cpp 程序。该代码是在 Mac OS 和 Mac OS 上编写的。作者(我无法联系到)使用 fread() 的两种变体。一个具有第二个参数指定为 sizeof(int) 和一个指定为 sizeof(unsigned)。假设 sizeof(int) == sizeof(unsinged) 使用这两种方法有什么区别吗?

fread(&intArr[0], sizeof (int), 1, datafile);
fread(&intArr[0], sizeof (unsigned), 1, datafile);

http://www.cplusplus.com/reference/cstdio/fread/

指定第二个参数是要读取的每个元素的字节大小,所以我认为它们的使用年龄不应该有任何差异(除非当然 sizeof() 不同)。这两种变体在整个文件中混合在一起(似乎是随机的),我无法确定原作者为什么会使用其中一种。我只是想确保我没有遗漏一些会影响其实现的微小细节。

【问题讨论】:

    标签: c++ binary integer sizeof fread


    【解决方案1】:

    假设 sizeof(int) == sizeof(unsigned) 有什么区别 在使用这两种方法?

    没有。 sizeof 运算符将在编译时解析为size_t 类型的值(其本身通常为unsigned longunsigned long long),即这些类型中的字节数(通常为4 或8 )。

    事实上,this C++ Draft Standard 声明 intunsigned int 大小相同:

    6.7.1 基本类型
    ...
    3 对于每个标准有符号整数类型,都存在一个 对应的(但不同的)标准无符号整数类型: “无符号字符”、“无符号短整数”、“无符号整数”、“无符号长整数” int”和“unsigned long long int”,每个都占用相同的 存储量并具有与相同的对齐要求 (6.6.5) 对应的有符号整数类型...

    此外,单独使用unsigned 等同于unsigned int。来自cppreference(我在标准草案中找不到它,但那个网站通常是可靠的):

    整数类型

    int - 基本整数类型。关键字int 可以省略 如果使用了下面列出的任何修饰符。

    (然后unsigned 被列为这些“修饰符”之一。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-25
      • 2011-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多