小编azr*_*iyl的帖子

long long vs int multiplication

给出以下代码段:

#include <stdio.h>

typedef signed long long int64;
typedef signed int int32;
typedef signed char int8;

int main()
{
    printf("%i\n", sizeof(int8));
    printf("%i\n", sizeof(int32));
    printf("%i\n", sizeof(int64));

    int8 a = 100;
    int8 b = 100;
    int32 c = a * b;
    printf("%i\n", c);

    int32 d = 1000000000;
    int32 e = 1000000000;
    int64 f = d * e;
    printf("%I64d\n", f);
}
Run Code Online (Sandbox Code Playgroud)

MinGW GCC 3.4.5的输出为(-O0):

1
4
8
10000
-1486618624
Run Code Online (Sandbox Code Playgroud)

第一个乘法在内部转换为int32(根据汇编程序输出).第二次乘法不是铸造的.我不确定结果是否不同,因为程序在IA32上运行,或者因为它是在C标准的某处定义的.然而,我感兴趣的是,这个确切的行为是在某处定义的(ISO/IEC 9899?),因为我想更好地理解为什么以及何时我需要手动编译(我有问题从不同的架构移植程序).

c multiplication long-long

7
推荐指数
2
解决办法
1万
查看次数

没有停止gdb中的所有线程

如果达到断点(或者在GDB shell中按下Ctrl + C),GDB通常会停止所有线程.我知道像调度程序锁定和调度多次这样的命令存在,但我认为没有可能让一个定义的线程在后台运行而另一个被调试.

c gdb pthreads

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

关于大型项目的gcov(静态库,......)

我正在处理具有以下目录布局的大型项目:

Source
 MyA
  aa.cpp
  ab.cpp
  ac.cpp
 MyB
  ba.cpp
  bb.cpp
  bc.cpp
 MyTest
  testaa.cpp
  testab.cpp
  testac.cpp
  testba.cpp
  testbb.cpp
  testbc.cpp
  main.cpp
Build
 MyA
  aa.o
  ab.o
  ac.o
  libMyA.a (static library)
 MyB
  ba.o
  bb.o
  bc.o
  libMyB.a (static library)
 MyTest
  testaa.o
  testab.o
  testac.o
  testba.o
  testbb.o
  testbc.o
  MyTest (executable)
Run Code Online (Sandbox Code Playgroud)

在编译之后,-fprofile-arcs -ftest-coverage我在Build/MyTest目录中执行MyTest应用程序.正如预期的那样,Build目录中有*.gcno和*.gcda文件.在MyTest目录中运行gcov后,会生成不同的*.gcov文件,但不幸的是,MyA和MyB中的所有文件都没有,尽管在这两个库中调用了每个函数.尝试了不同的选项,但不知怎的,我无法用这种布局创建有用的(意味着正确的)*.gcov文件.

如果我复制一个目录中的每个cpp并重复这些步骤,一切都按预期工作,覆盖率分析是完美的.

gcc build-process unit-testing code-coverage gcov

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