标签: stdint

有没有办法修复stdint类型的格式说明符警告?

问题是在一个平台上(windows,mvsc2015)uint64_t被定义为unsigned long long另一个平台(ubuntu,clang),unsigned long并且有代码看起来像 sprintf(buffer, "%#llx", u64key);

c printf typedef stdint

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

uintptr_t与DWORD_PTR的用法

两者都用于存储地址和做指针运算,两者都是在WinAPI中定义的,我何时应该使用uintptr_t(cstdint)vs a DWORD_PTR(Windows.h)?两者分别是x86和x86_64中的32位和64位

A DWORD_PTRunsigned long用于指针精度的类型.在向unsigned long类型转换指针以执行指针运算时使用它.DWORD_PTR也常用于在64位Windows中扩展到64位的一般32位参数.

我不打算让我的代码可移植,我坚持使用WinAPI.什么类型的最佳用例?

c++ types stdint

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

在 C 中定义全局常量

如何在 C 中定义全局常量?我被告知要做这样的事情

在 header.h

const u32 g_my_const;
Run Code Online (Sandbox Code Playgroud)

在代码.c

#include "header.h"
const u32 g_my_const= 10U;
Run Code Online (Sandbox Code Playgroud)

但我收到一个编译错误:

错误:未初始化的 const 'g_my_const' [-fpermissive]

有人可以解释如何正确地做到这一点。

c declaration extern stdint

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

是否可以在编译时确定实现是否提供精确宽度的整数类型?

是否可以在编译时确定实现是否提供精确宽度的整数类型?示例代码(想要):

#include <stdint.h>

#if HAS_EXACT_WIDTH_INTEGER_TYPES
uint32_t    i;
#else
/* handle the case */
#endif
Run Code Online (Sandbox Code Playgroud)

问题的原因:编写适应性强的代码,如果实现不提供精确宽度的整数类型,则不会导致编译时错误。

c stdint c11 c17

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

stdint.h 库中包含的整数类型是“扩展整数类型”吗?

我正在学习整数转换等级,但我有一个问题,我经常使用 stdint.h 库,并且我读到的有关“整数转换等级”的内容是:

“任何标准整数类型的等级应大于具有相同大小的任何扩展整数类型的等级。”

例如,据我所知,“int”是标准整数类型,但使用 stdint.hi 具有等于“int”的“int32_t”

我知道 stdint.h 库使用“typedef”,因此理论上 int 和 int32_t 是相等的,但我在论坛中读到“扩展整数类型”使用 (u)intxx_t 来引用

所以我的问题是,stdint.h 库中包含的“精确宽度整数”是“标准整数类型”还是被视为“扩展整数类型”?

感谢您的回答!

c types integer stdint

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

C:gcc中的uint16_t减法行为

我试图减去两个无符号整数并将结果与​​有符号整数(或文字)进行比较.使用unsigned int类型时,行为符合预期.当使用uint16_t(from stdint.h)类型时,行为不是我所期望的.使用gcc 4.5进行比较.
给出以下代码:

unsigned int a;
unsigned int b;

a = 5;
b = 20;

printf("%u\n", (a-b) < 10);
Run Code Online (Sandbox Code Playgroud)

输出为0,这是我的预期.a和b都是无符号的,b大于a,因此结果是一个大的无符号数,大于10.现在如果我改变a和b来输入uint16_t:

uint16_t a;
uint16_t b;

a = 5;
b = 20;

printf("%u\n", (a-b) < 10);
Run Code Online (Sandbox Code Playgroud)

输出为1.这是为什么?两个uint16_t类型之间的减法结果是存储在gcc中的int中吗?如果我更改1010U输出再次为0,这似乎支持这一点(如果减法结果存储为int并且与unsigned int进行比较,则减法结果将转换为unsigned int).

c unsigned gcc stdint

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

最佳实践:在头文件中使用stdint类型

确保stdint.h包含使用该标头中的类型的标头的最佳方法是什么?

我能看到的替代方案是:

  • 包括stdint.h在标题本身(危险,不是吗?)
  • 如果在解析标题时未包含某些内容,则会将某些内容标记为编译器(类似于#ifndef _STDINT_H附带的内容)#error "stdint.h not included"
  • 教育其他开发人员总是stdint.h在我需要它的任何标题之前包括,使用注释,对话,文档或三者的混合(最后一个是优选的).

如果还有其他值得一提的选择,请随意这样做 - 我只是猜测我应该在这里做些什么.

c header stdint

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

与inttypes.h,fscanf(),fprintf()不一致

我有一些关于inttypes的问题,这里用这个小代码示例说明:

#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>


void print_byte(uint8_t b)
{
    printf("%d%d%d%d%d%d%d%d\n",
        !!(b & 128), !!(b & 64), !!(b & 32), !!(b & 16),
        !!(b & 8), !!(b & 4), !!(b & 2), !!(b & 1));
}

int main()
{
    FILE *f;
    uint8_t bs = 8;
    uint16_t bw = 100, bh = 200;
    f = fopen("out", "w+");

    print_byte(bs);
    printf("%"PRIu8" %"PRIu16" %"PRIu16"\n", bs, bw, bh);
    fprintf(f, "%"PRIu8"%"PRIu16"%"PRIu16, bs, bw, bh);
    fclose(f);

    f = fopen("out", "r");

    fscanf(f, "%"SCNu8"%"SCNu16"%"SCNu16, &bs, &bw, &bh);   
    printf("%"PRIu8" …
Run Code Online (Sandbox Code Playgroud)

c scanf stdint

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

为什么type int适用于sscanf但int16_t不适用?

我正在尝试将用户输入流的值分配给变量M和N.如果我指定类型为int的M和N,我可以使我的代码工作.但是,当我使用stdint.h将它们指定为int16_t时,它将读取第一个值,但不会读取最后一个值.为什么是这样?

这里的代码工作得很好......

#include <stdio.h>
#include <stdint.h>
int main(void)
{
    char str[10];
    int M, N;
    fgets(str, 10, stdin);
    sscanf(str, "%d%d", &M, &N);
    printf("M is: %d\n", M);
    printf("N is: %d\n", N);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在这里它不起作用.

#include <stdio.h>
#include <stdint.h>
int main(void)
{
    char str[10];
    int16_t M, N;
    fgets(str, 10, stdin);
    sscanf(str, "%d%d", &M, &N);
    printf("M is: %d\n", M);
    printf("N is: %d\n", N);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c scanf fgets stdint

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

如何确定您的机器是否支持C中的标准整数数据类型?

我对C中stdint.h的概念有点熟悉.通过明确说明整数的大小,头文件将用该机器上的相应整数替换#define整数.例如,如果我的机器有16位无符号整数,uint32_t则将替换为long unsigned int.

但是,假设您的机器仅支持最多32位整数.如果你使用了会发生什么int64_t?如果本机不支持此整数大小,那么如何解决这个问题,因为没有替代方法可以修复它?

编译器会抛出错误并说它无法解决吗?或者它会尝试使用两个32位分配来保存64位数据类型吗?

c stdint

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

标签 统计

stdint ×10

c ×9

scanf ×2

types ×2

c++ ×1

c11 ×1

c17 ×1

declaration ×1

extern ×1

fgets ×1

gcc ×1

header ×1

integer ×1

printf ×1

typedef ×1

unsigned ×1