当在c中调用变量参数函数时,整数参数被提升为int,浮点参数被提升为double
由于原型未指定可选参数的类型,因此在调用可变参数函数时,将对可选参数值执行默认参数提升.这意味着类型
char
或short int
(无论是否签名)的对象被提升为任何一个int
或unsigned int
适当的; 并且类型的对象float
被提升为类型double
.因此,如果调用者将achar
作为可选参数传递,则将其提升为aint
,并且该函数可以使用它来访问它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) 我需要在某个偏移量处修改二进制文件中的一个字节。
例子:
A.bin
B.bin
我需要在偏移到读一个字节0x40c
从A.bin
,清楚的这个字节的0至少显著2个比特,然后写入文件B.bin
等于A.bin
,但与计算出的字节偏移量0x40c
。
printf
和dd
。我在 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
在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++中做同样的事情吗?
我有两个文件应该从相同的源版本生成。其中一个文件被剥离。是否可以比较文件的原始可执行部分以确定它们是否相同?还可以在目标文件上(尤其是在.ko linux内核模块上)完成吗?
最好的祝福
Cortex-M 处理器实现了 CPUID 寄存器,通过它可以检测有关内核的信息:部件号(例如 Cortex M7 或 M4)、版本和补丁级别(例如 r1p2)等。
是否有寄存器或方法来检测FPU是否已被实现者实现?如何检测FPU的类型(VFPv4、VFPv5-SP或VFPv5-DP)?
当我执行这两行时:
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)
同样的结果
所以我想知道整数类型的精度字段是什么意思
我有一段假/示例代码:
#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)