gpt4 book ai didi

c - 为什么会这样?当在数学函数中使用时,ANSI 是否会将十六进制 "form"写入的值转换为十进制等值?

转载 作者:行者123 更新时间:2023-11-30 21:43:14 25 4
gpt4 key购买 nike

例如,如果我要编译并运行这段代码,它会完美地工作。我的问题是,它到底是如何工作的。编译器如何除法,例如十六进制数字 AF3F6F9F 与数字 2 并给出结果令人满意吗?

这是一个示例程序:

#include <stdio.h> 
int main(void)
{
int a, b, c, d, e, f;
printf("Insert MAC address in hex form: ");
scanf("%x:%x:%x:%x:%x:%x", &a, &b, &c, &d, &e, &f);
if ((a == 0xff) && (b == 0xff) && (c == 0xff) && (d == 0xff) && (e == 0xff) && (f == 0xff))
{
printf("This is a broadcast address\n");
}
else if ((a % 2) == 0) { printf("This is a unicast address\n"); }
else if ((a % 2) != 0)
{
printf("This is a multicast address\n");
}
return 0;
}

最佳答案

the hex number

没有“十六进制数字”。数字有十六进制表示。数字的十六进制表示为 AF3F6F9F,等于二进制表示 10101111001111110110111110011111,等于十进制表示为 2940170143,等于以下表示以 3 21120220110010012111 为底。目前广泛使用的计算机使用二进制表示数字。但它可能会改变。

How does the compiler divide

您已经编写了代码,因此编译器不会将数字相除。程序执行后,编译器会生成用于除法的机器指令。所以你的程序对数字进行除法,而不是编译器。

example the hex number AF3F6F9F with the number 2

例如,在 x86-64 兼容架构上,以下代码的有效编译器:

int f(int a, int b) {
return a % b;
}

可以生成以下机器指令:

f:
mov eax, edi
cdq
idiv esi
mov eax, edx
ret

正如我们所见,指令idiv用于除法,该指令代表signed divide并且确实将数字相除。

give out a result that is satisfactory?

作为机器的用户,您相信编译器会生成可以由您的处理器正确解析的有效机器代码,并且您也相信您的处理器在使用用于除法的指令时能够给出正确的结果。只要您的机器正常工作,结果将是“令人满意的”(就有效的数学结果而言)。

关于c - 为什么会这样?当在数学函数中使用时,ANSI 是否会将十六进制 "form"写入的值转换为十进制等值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53161430/

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