小编Swa*_*ala的帖子

无符号位字段值与有符号值的比较

在编写代码时,我在代码中观察到一件事,它与比特字段值与负整数的比较有关.

我有一个大小为1位的无符号结构成员和一个unsigned int.当我将负值与unsigned int变量进行比较时,我得到预期的结果为1但是当我将结构成员与负值进行比较时,我得到的结果相反为0.

#include <stdio.h>
struct S0
{
   unsigned int bit : 1;
};
struct S0 s;

int main (void) 
{
   int negVal = -3;
   unsigned int p = 123;
   printf ("%d\n", (negVal > p)); /*Result as 1 */
   printf ("%d\n", (negVal > s.bit));/*Result as 0 but expected 1 */
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

我怀疑的是,如果我将负值与unsigned int进行比较,那么将发生平衡(隐式类型转换).但是如果我比较unsigned int的结构成员为什么没有发生隐式类型转换.如果我错过任何基本的比特字段,请纠正我?

c bit-fields

5
推荐指数
2
解决办法
82
查看次数

从 CPIO 生成的文件中填充了额外的字节

我有一个目录中的文件列表,我想创建一个存档格式文件。我使用 CPIO 将文件创建为

ls |  cpio -ov -H crc > demo.cpio
Run Code Online (Sandbox Code Playgroud)

我有一个像这样的 cpio 结构

struct cpio_newc_header {
        char    c_magic[6];
        char    c_ino[8];
        char    c_mode[8];
        char    c_uid[8];
        char    c_gid[8];
        char    c_nlink[8];
        char    c_mtime[8];
        char    c_filesize[8];
        char    c_devmajor[8];
        char    c_devminor[8];
        char    c_rdevmajor[8];
        char    c_rdevminor[8];
        char    c_namesize[8];
        char    c_check[8];
};
Run Code Online (Sandbox Code Playgroud)

我可以通过使用 c_filesize,c_namesize 来获取头文件中的元数据、路径名、文件数据。我可以根据 c_filesize 获取文件数据,但是在获取文件数据后,填充了一些额外的位,即在文件数据之后在下一个标题之前。

00000230: 6e63 6965 7322 3a5b 5d0d 0a7d 0d0a 0000  ncies":[]..}....
00000240: 3037 3037 3032 3030 3636 4246 3838 3030  0707020066BF8800
Run Code Online (Sandbox Code Playgroud)

在这里我们可以观察到在 '}' 之后填充了一些额外的字节。我用四的倍数教了它的四舍五入,但我观察到了一些不是四的倍数的其他数据

00000450: 2066 6f72 2063 7279 7074 …
Run Code Online (Sandbox Code Playgroud)

c cpio

1
推荐指数
1
解决办法
132
查看次数

标签 统计

c ×2

bit-fields ×1

cpio ×1