int
main
(
)
{
uint8_t
arr
[
]
=
{
0x10
,
0xA1
,
0xB2
,
0xC3
,
0xD4
,
0xE5
,
0xF6
}
;
int
i
;
for
(
i
=
0
;
i
<
sizeof
(
arr
)
/
sizeof
(
arr
[
0
]
)
;
i
++
)
{
printf
(
"%02X "
,
arr
[
i
]
)
;
return
0
;
在这个例子中,
%02X
是一个格式化字符串,用于输出一个uint8_t类型的16进制数,
%02X
中的
0
表示如果输出的16进制数只有一位,那么前面将用0填充,
2
表示输出的16进制数总宽度为2,不足的用0填充,
X
表示以大写形式输出16进制数。
在C语言中,可以使用printf函数,利用格式化输出功能将uint8_t类型的数组以16进制形式输出。是一个格式化字符串,用于输出一个uint8_t类型的16进制数,表示如果输出的16进制数只有一位,那么前面将用0填充,表示输出的16进制数总宽度为2,不足的用0填充,表示以大写形式输出16进制数。
Pr
int
fLogo(); /*
打印
例程Logo到串口1 */
bsp_DelayMS(100); /* 等待上电稳定,等基准电压电路稳定, bsp_InitADS1256() 内部会进行自校准 */
bsp_InitADS1256(); /* 初始化配置ADS1256. PGA=1, DRATE=30KSPS, BUFEN=1, 输入正负5V */
/*
打印
芯片ID (通过读ID可以判断硬件接口是否正常) , 正常时状态寄存器的高4bit = 3 */
#if 0
u
int
8_t id;
id = ADS1256_ReadChipID();
if (id != 3)
pr
int
f("Error, ASD1256 Chip ID = 0x%X\r\n", id);
pr
int
f("Ok, ASD1256 Chip ID = 0x%X\r\n", id);
#endif
ADS1256_CfgADC(ADS1256_GAIN_1, ADS1256_30SPS); /* 配置ADC参数: 增益1:1, 数据
输出
速率 1KHz */
ADS1256_StartScan(); /* 启动中断扫描模式, 轮流采集8个通道的ADC数据. 通过 ADS1256_GetAdc() 函数来读取这些数据 */
while (1)
bsp_Idle(); /* 空闲时执行的函数,比如喂狗. 在bsp.c中 */
/*
打印
采集数据 */
for (i = 0; i < 8; i++)
int
32_t iTemp;
iTemp = ((
int
64_t)g_tADS1256.AdcNow[i] * 2500000) / 4194303; /* 计算实际电压值(近似估算的),如需准确,请进行校准 */
if (iTemp < 0)
iTemp = -iTemp;
pr
int
f("%d=%6d,(-%d.%03d %03d V) ", i, g_tADS1256.AdcNow[i], iTemp /1000000, (iTemp%1000000)/1000, iTemp%1000);
pr
int
f("%d=%6d,( %d.%03d %03d V) ", i, g_tADS1256.AdcNow[i], iTemp/1000000, (iTemp%1000000)/1000, iTemp%1000);
pr
int
f("\r\n");
bsp_DelayMS(500); /* 每隔500ms
输出
一次数据 */
u
int
64_t num = 9223354444668731392;
pr
int
f("%lu\n", num); //十进制
输出
pr
int
f("0x%"PRIx64"\n", num); //十六进制
输出
pr
int
f("0x%016lx\n", num); //十六进制
输出
运行结果:
1 92233544446687...
C语言
实现
16进制
数与10进制数的转化
这里有两种情况:
①第一种情况:如果我得到的是一个
16进制
数,我通过肉眼看到的就是
16进制
显示(这里看到的肯定
打印
结果),比如85,我知道这个数是
16进制
,但是代码里面却不是,在内存空间里却是按照
int
类型10进制进行存储的。需要将它在内存空间里面也转化为
16进制
的存储。
#include <stdio.h>
#include <stdin...
1、通常
打印
u
int
8_t类型的时候,我们直接使用%u来
打印
。但是更加严谨的做法是使用%hhu来
打印
。详细说明参见cppreference
2、我们new之后,应该对指针进行判空,判断new是否执行成功
很多时候我们会直接这样写Xxx *obj = new Xxx();,但是这样写,当new执行失败后会抛出异常,而不是返回nullptr,所以后续的判空也就是无效的。
正确的写法如下,应该给new标记nothrow,这样出错时就会返回nullptr:
详细参考cppreference
#include &
u
int
8_t 是一种整型数据类型,表示无符号 8 位整数。它是 C
语言
中整型数据类型的一种,它在计算机内部以二进制形式存储。
你可以在程序中声明 u
int
8_t 类型的变量,并使用它来存储无符号 8 位整数值。例如:
u
int
8_t a = 10;
u
int
8_t b = 20;
u
int
8_t c = a + b;
在上面的代码中,我们声明了三个 u
int
8_t 类型的变量 a、b 和 c...
感谢StefanDeigmüller找到操作员中的错误*。
感谢FrançoisDessenne说服我对该类进行了一般性的重写。
感谢John Skaller在将符号编译为共享库时使符号可见。 这最初是在u
int
256_t完成的,我将其复制到此处。
这是C ++中无符号128位整数类型的简单实现。 它的意图是像标准u
int
X_t一样使用,除了比特大小比C / C ++提供的更大。
在代码中只需完成#include "u
int
128_t.h"
# include < iostream>
# include " u
int
128_t.h
libyoga - C++ 的现代
输出
如果 C++ 程序员想要在命令行中
打印
一些东西,基本上可以在来自 cstdio 的旧 C 函数或稍微较新的 C++ 流之间进行选择。 这两个接口都有很大的问题:
pr
int
f-family 是极其危险和愚蠢的:
使用稍微错误的
格式
字符串会导致未定义的行为。
函数无法推断其参数的类型,它们必须通过
格式
字符串传递。
使用 typedefed 整数类型编写可移植代码是很可笑的。 正确的解决方案是包含
int
types.h,它为正确的类型提供宏。 这会导致这样的调用: pr
int
f("foo%" PRI64 "bar, u
int
64_t{0});
虽然流解决了这些问题,但它们自己也创造了几个问题:
使用流
格式
化
输出
非常冗长。 要以十六进制
打印
具有 16 个字符(前导零)的 u
int
64_t,必须这样写: stream << std::set
image_to_c
用于将二进制图像文件转换为C源代码的命令行工具。
输出
是无符号字符
数组
,并发送到stdout。 其中包括详细说明图像类型,尺寸和其他详细信息的注释。 你为什么写它? 我现有的工具(bin_to_c)与之类似,它生成C
数组
以将文件数据直接编译到项目中。 我已经使用此工具创建了许多.H文件以包含在我的项目中,但是仅文件名不足以了解数据中包含的图像文件的详细信息。 我没有将这些信息手动添加到每个文件中,而是想到了将我的imageinfo工具与bin_to_c工具结合起来以使某些东西变得更加有用的想法。
输出
是什么样的? 这是此新工具之前和之后的示例:
变成这种类型的文件:
放入这种类型的文件:
它支持哪些图像文件类型?
PNG,JPEG,BMP,TIFF,GIF,PPM,TARGA,JEDMCS,CALS和PCX
无法识别的文件会怎样? 如果文件类型未知,它
u
int
8_t hex_array[strlen(str)/2 + 1];
int
i, j;
for (i = 0, j = 0; i < strlen(str); i += 2, j++) {
sscanf(&str[i], "%02x", &hex_array[j]);
hex_array[j] = '\0';
pr
int
f("Original string: %s\n", str);
pr
int
f("Hex array: ");
for (i = 0; i < strlen(str)/2; i++) {
pr
int
f("%02x ", hex_array[i]);
pr
int
f("\n");
return 0;
在上面的示例中,我们首先声明了一个字符串变量 `str`,然后声明一个 u
int
8_t 类型的
数组
`hex_array`,用于存储转换后的
16进制
值。然后我们使用 `sscanf` 函数将字符串中每两个字符转换为一个
16进制
数,并存储到 `hex_array`
数组
中。最后,我们
打印
了原始字符串和转换后的
16进制
数组
。
需要注意的是,如果字符串的长度为奇数,则我们将忽略最后一个字符。