c - C 中的对齐和除法地址变量

标签 c clang

<分区>

有人可以向我解释一下 C 中的对齐方式是什么吗? 我是 C 的初学者,我不能完全知道如何使用它。

main(){
  int i1 = 1, i2 = -1;
  unsigned int ui1 = 1, ui2 = -1;
  long l1 = 2, l2 = -2;
  unsigned long ul1 = 2, ul2 = -2;
  float f1 = 2.5;
  double d1 = 2.5;
  char c = 'A';
}

我必须检查所附程序代码中各个变量的地址是否可以被 2、4 和 8 整除。

这与变量的大小和对齐方式有什么关系?

如果您能提供合乎逻辑的解释,我将不胜感激。

额外代码(从评论中转录):

if( *w_i1 % 2 == 0 )
{
    printf("Address of i1 divisible by 2\n");
}
else
    printf("No by 2\n");
if( *w_i1 % 4 == 0 )
{
    printf( "Address of i1 divisible by 4\n" );
}
else
    printf("No by 4\n");
if( *w_i1 % 8 == 0 )
{
    printf( "Address of i1 divisible by 8\n" );
}
else
    printf("No by 8\n");

最佳答案

首先这样做:

printf( "var %s is %d wide at %x\n", "i1", sizeof( i1 ), &i1 );

对于每个变量。现在您已经打印了名称 %s、它使用了多少字节 %d 和变量的十六进制地址 %x。下一步留给学生回答。 ;-) 提示:在代码中进行数学计算,而不是在计算器上。

请注意,%x 可能需要根据您的编译器而有所不同,请查看您系统上 printf 的文档。

CPU 以 block 的形式访问数据,也就是位的集合。具体是1、2、4字节等等。当变量与特定值(通常是 float )对齐时,某些操作会更快。这可能不是对现代 CPU 的严格要求。如果是,编译器应该自行调整。

关于c - C 中的对齐和除法地址变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43968712/

相关文章:

c - 创建字符数组的方法之间的区别

ios - iOS 应用程序中的 C 样式字符串被损坏

c - 有没有其他方法可以让程序将主机名打印到标准输出或只是 shellcode?

c++ - 使用 Memory Sanitizer 检测 libc++

c++ - CMake 使用 clang 而不是 clang++

macos - 我如何告诉链接器使用方法的多个实现中的哪一个?

c - 编写一个支持 '.' , '*' 和 '.*' 的正则字符串匹配函数

c - 我的 C 代码中的段错误需要帮助

c++ - 在 LLVM 中,你如何检查一个 block 是否是一个合并 block

c++ - 执行失败,Value::getName 和 Value::HasName (LLVM)