不寻常的条件(*((uint64_t*)buf)== NEG)

Kev*_*vin 1 c

案例是我正在研究我在互联网上找到的引起我注意的代码,是这样的:

#include <stdio.h>
#include <stdint.h>
#define NEG ~0x0LL

void ITOC(int8_t *vec, int n)
{
    int8_t *p = vec;
    for(; n; n /= 10) *p++ = n % 10;
}

void ncmp(int8_t *buf, int y)
{
    int tmp, i = 0;

    for (; y ; y/=10)
    {
        tmp =  y % 10;
        for(i = 0; i < 8; i++)
            if(buf[i] == tmp && buf[i] != -1)
            {
                buf[i] = -1;
                break;
            }
    }
}
int main(void)
{
    int8_t buf[8];
    int y = 21 ,z = 60, n = 1260;
    *((uint64_t*) buf) = NEG;

    ITOC(buf, n);
    ncmp(buf, y);
    ncmp(buf, z);

    if( *((uint64_t*) buf) == NEG )
        printf("%d = %d * %d\n", n, y, z);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

部分我不明白这一行:

if( *((uint64_t*) buf) == NEG )
Run Code Online (Sandbox Code Playgroud)

如果变量具有以下值:

y = 21 z = 60 n = 1260
Run Code Online (Sandbox Code Playgroud)

条件为真,但如果这些值包含:

y = 18 z = 81 n = 1458
Run Code Online (Sandbox Code Playgroud)

在这种情况下,第一个位置buf是-1,如果if仅比较第一个位置和NEG也应该为真.

有人能解释会发生什么吗?

JS1*_*JS1 5

我不知道你在哪里找到这个代码,但它肯定不会做你认为它做的.

你认为它做的是检查某种乘法.可能是因为它最后打印了"n = y*z".但是,它实际上是需要的数字n,并删除的数字yz.如果删除了所有数字,则会打印该消息.例如:

1111 = 11 * 11    true
1234 = 12 * 34    true
1500 = 10 * 50    true
1500 = 30 * 50    false
1458 = 18 * 81    false
1458 = 14 * 58    true
1458 = 45 * 18    true
Run Code Online (Sandbox Code Playgroud)