小编mas*_*sti的帖子

更好地理解c中可变参数的类型推广

当在c中调用变量参数函数时,整数参数被提升为int,浮点参数被提升为double

由于原型未指定可选参数的类型,因此在调用可变参数函数时,将对可选参数值执行默认参数提升.这意味着类型charshort int(无论是否签名)的对象被提升为任何一个intunsigned int适当的; 并且类型的对象float被提升为类型double.因此,如果调用者将a char作为可选参数传递,则将其提升为a int,并且该函数可以使用它来访问它va_arg (ap, int).

int类型应该是32位机器上的4字节和64位机器上的8字节,是吗?
所以我想知道当我将一个long long int带有%lld格式的printf 传递给变量参数函数时会追加什么.
而且,我再次想知道当我将一个long double变量传递给带有%Lf格式的printf时(无论是在32位还是64位机器上).

[已编辑 ]

在32位机器上,我试过这个:

#include <stdio.h>

int main(void)
{
    printf("sizeof(int) %d\n", sizeof(int));
    printf("sizeof(long int) %d\n", sizeof(long int));
    printf("sizeof(long long int) %d\n", sizeof(long long int));
    printf("%lld\n", 1LL<<33);

    printf("sizeof(float) %d\n", sizeof(float));
    printf("sizeof(double) %d\n", sizeof(double));
    printf("sizeof(long double) %d\n", sizeof(long double)); …
Run Code Online (Sandbox Code Playgroud)

c floating-point int printf c99

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

使用标准的 linux 命令行工具修改二进制文件中的一个字节

我需要在某个偏移量处修改二进制文件中的一个字节。

例子:

  • 输入文件: A.bin
  • 输出文件: B.bin

我需要在偏移到读一个字节0x40cA.bin,清楚的这个字节的0至少显著2个比特,然后写入文件B.bin等于A.bin与计算出的字节偏移量0x40c

binary bash shell patch edit

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

如何使用介子设置调试和优化标志

我在 ubuntu 20.04 上使用介子 0.53.2。
我想要一个最大限度优化的可执行文件 ( -Ofast) 但包含所有调试符号 ( -g3)

  • 如果我使用--buildtype=release它优化-O2并且可执行文件不包含调试符号。
  • 如果我使用--buildtype=debug它根本不会优化并使用-g.
  • 如果我使用--buildtype=debugoptimized它优化-O2并使用-g.

我尝试使用--debug它似乎不起作用,因为可执行文件不包含任何调试符号。相反,如果我使用-Ddebug=true调试符号,则存在但带有 flag -g

那么我该如何以最不脏的方式gcc使用标志进行编译呢?-Ofast -g3

linux optimization gcc meson-build

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

使用new分配一个零长度数组的结构

在C(使用gcc)中,我可以声明一个变长结构,如下所示:

typedef struct ProtocolFrame
{
     uint8_t      op;
     uint32_t     address;
     uint16_t     size;
     uint8_t      payload[0];
} ProtocolFrame;
Run Code Online (Sandbox Code Playgroud)

然后我可以分配不同的框架:

ProtocolFrame *frA;
ProtocolFrame *frB;

frA = malloc(sizeof(ProtocolFrame) + 50);
frB = malloc(sizeof(ProtocolFrame));
Run Code Online (Sandbox Code Playgroud)

在此示例中,frA具有大至50字节的有效载荷字段,并且frB没有有效载荷

我可以使用new运算符在C++中做同样的事情吗?

c++ malloc new-operator

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

比较可执行文件或目标文件

我有两个文件应该从相同的源版本生成。其中一个文件被剥离。是否可以比较文件的原始可执行部分以确定它们是否相同?还可以在目标文件上(尤其是在.ko linux内核模块上)完成吗?

最好的祝福

linux compare strip elf

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

如何检测Cortex M中的FPU?

Cortex-M 处理器实现了 CPUID 寄存器,通过它可以检测有关内核的信息:部件号(例如 Cortex M7 或 M4)、版本和补丁级别(例如 r1p2)等。

是否有寄存器或方法来检测FPU是否已被实现者实现?如何检测FPU的类型(VFPv4、VFPv5-SP或VFPv5-DP)?

arm fpu cortex-m

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

格式化整数时printf中的精度字段

当我执行这两行时:

printf("%.5d\n", 3);  // use of precision filed
printf("%05d\n", 3);  // use of 0 flag to prepend with 0
Run Code Online (Sandbox Code Playgroud)

我得到以下输出:

00003
00003
Run Code Online (Sandbox Code Playgroud)

同样的结果

所以我想知道整数类型的精度字段是什么意思

c printf

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

如何修复由 -Wconversion 引起的错误?

我有一段假/示例代码:

#include <stdint.h>

uint8_t func(uint16_t val0, uint16_t val1, uint16_t val2)
{
    uint8_t r;
    val0 += 0x7F;
    val1 += (uint16_t)0x7F;
    val2 += 0x7FU;
    r = (uint8_t)((val0+val1+val2) >> 8);
    r <<= (uint8_t)(val2 & 0x3);
    return r;
}
Run Code Online (Sandbox Code Playgroud)

以下是我得到的错误:

$ gcc -Wall -Wextra -Wconversion -O0 module.c -c -o module.o 
module.c: In function 'func':
module.c:6:10: warning: conversion from 'int' to 'uint16_t' {aka 'short unsigned int'} may change value [-Wconversion]
    6 |  val0 += 0x7F;
      |          ^~~~
module.c:7:10: warning: conversion from 'int' to …
Run Code Online (Sandbox Code Playgroud)

c gcc

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

标签 统计

c ×3

gcc ×2

linux ×2

printf ×2

arm ×1

bash ×1

binary ×1

c++ ×1

c99 ×1

compare ×1

cortex-m ×1

edit ×1

elf ×1

floating-point ×1

fpu ×1

int ×1

malloc ×1

meson-build ×1

new-operator ×1

optimization ×1

patch ×1

shell ×1

strip ×1