问题是在一个平台上(windows,mvsc2015)uint64_t被定义为unsigned long long另一个平台(ubuntu,clang),unsigned long并且有代码看起来像
sprintf(buffer, "%#llx", u64key);
两者都用于存储地址和做指针运算,两者都是在WinAPI中定义的,我何时应该使用uintptr_t(cstdint)vs a DWORD_PTR(Windows.h)?两者分别是x86和x86_64中的32位和64位
A
DWORD_PTR是unsigned long用于指针精度的类型.在向unsigned long类型转换指针以执行指针运算时使用它.DWORD_PTR也常用于在64位Windows中扩展到64位的一般32位参数.
我不打算让我的代码可移植,我坚持使用WinAPI.什么类型的最佳用例?
如何在 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]
有人可以解释如何正确地做到这一点。
是否可以在编译时确定实现是否提供精确宽度的整数类型?示例代码(想要):
#include <stdint.h>
#if HAS_EXACT_WIDTH_INTEGER_TYPES
uint32_t i;
#else
/* handle the case */
#endif
Run Code Online (Sandbox Code Playgroud)
问题的原因:编写适应性强的代码,如果实现不提供精确宽度的整数类型,则不会导致编译时错误。
我正在学习整数转换等级,但我有一个问题,我经常使用 stdint.h 库,并且我读到的有关“整数转换等级”的内容是:
“任何标准整数类型的等级应大于具有相同大小的任何扩展整数类型的等级。”
例如,据我所知,“int”是标准整数类型,但使用 stdint.hi 具有等于“int”的“int32_t”
我知道 stdint.h 库使用“typedef”,因此理论上 int 和 int32_t 是相等的,但我在论坛中读到“扩展整数类型”使用 (u)intxx_t 来引用
所以我的问题是,stdint.h 库中包含的“精确宽度整数”是“标准整数类型”还是被视为“扩展整数类型”?
感谢您的回答!
我试图减去两个无符号整数并将结果与有符号整数(或文字)进行比较.使用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中吗?如果我更改10为10U输出再次为0,这似乎支持这一点(如果减法结果存储为int并且与unsigned int进行比较,则减法结果将转换为unsigned int).
确保stdint.h包含使用该标头中的类型的标头的最佳方法是什么?
我能看到的替代方案是:
stdint.h在标题本身(危险,不是吗?)#ifndef _STDINT_H附带的内容)#error "stdint.h not included"stdint.h在我需要它的任何标题之前包括,使用注释,对话,文档或三者的混合(最后一个是优选的).如果还有其他值得一提的选择,请随意这样做 - 我只是猜测我应该在这里做些什么.
我有一些关于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) 我正在尝试将用户输入流的值分配给变量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中stdint.h的概念有点熟悉.通过明确说明整数的大小,头文件将用该机器上的相应整数替换#define整数.例如,如果我的机器有16位无符号整数,uint32_t则将替换为long unsigned int.
但是,假设您的机器仅支持最多32位整数.如果你使用了会发生什么int64_t?如果本机不支持此整数大小,那么如何解决这个问题,因为没有替代方法可以修复它?
编译器会抛出错误并说它无法解决吗?或者它会尝试使用两个32位分配来保存64位数据类型吗?