gpt4 book ai didi

c - 如何将十六进制值转换为 WORD、DWORD 或 QWORD 并将结果存储在双变量中?

转载 作者:行者123 更新时间:2023-12-04 12:03:10 29 4
gpt4 key购买 nike

我正在尝试通过这种方式将带符号的十六进制数转换为 WORD、DWORD 和 QWORD:

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

int main(void) {

printf("WORD=%d\n", (int16_t) strtol("F123", NULL, 16));
printf("DWORD=%d\n", (int32_t) strtol("FFFFF123", NULL, 16));
printf("QWORD=%lld\n", (int64_t) strtol("FFFFFFFFFFFFF123", NULL, 16));

return 0;
}

但它返回以下内容:

WORD=-3805
DWORD=2147483647
QWORD=2147483647

http://ideone.com/mqjldk

但是为什么 DWORD 和 QWORD 转换没有返回 -3805 呢?

我的意思是:存储在 DWORD 中的 0xFFFFF123 将包含十进制的 -3805 值,而不是 2147483647

预期输出:

WORD=-3805
DWORD=-3805
QWORD=-3805

您有按位选择吗?

最佳答案

如果 long int 有 32 位,0xFFFFF123 超出了 long int 的范围,因此 strtol() 返回 LONG_MAX(在我们的例子中为 0x7FFFFFFF = 2147483647)。

使用 strtoull() 将字符串转换为至少 64 位的无符号整数,并在继续之前始终检查错误。

要打印具有指定位大小的整数,请使用以下内容:

printf("foo=%"PRIu32"\n",(uint32_t) foo);

更好的方法:

#include <stdio.h>
#include <stdlib.h>
#define __STDC_FORMAT_MACROS //we need that for PRI[u]8/16/32 format strings
#include <inttypes.h>
#include <errno.h>

void error_exit(void)
{
perror("ups");
exit(EXIT_FAILURE);
}

int main(void)
{
unsigned long long temp;
errno=0;
temp = strtoull("FFFFF123", NULL, 16);
if(errno)
{
error_exit();
}
printf("DWORD=%"PRId32"\n", (int32_t) temp );
errno=0;
temp = strtoull("FFFFFFFFFFFFF123", NULL, 16);
if(errno)
{
error_exit();
}
printf("QWORD=%"PRId64"\n", (int64_t) temp );

return EXIT_SUCCESS;
}

关于c - 如何将十六进制值转换为 WORD、DWORD 或 QWORD 并将结果存储在双变量中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36085496/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com