“快速”类型可以阻止从 int 到 uint 的转换吗?

问题描述 投票:0回答:1

考虑以下程序

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

int main()
{
    uint16_t result;
    uint16_t ui = 1;
    int16_t si = -1;
    
    result = si * ui;
    
    printf("%i", result);

    return 0;
}

这将打印值 65535,这是我阅读完这篇文章后所期望的:

si
转换为
ui
,因此将 max+1 添加到其中。现在,在下一个代码片段中,我将结果类型更改为
uint_fast16_t

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

int main()
{
    uint_fast16_t result;
    uint16_t ui = 1;
    int16_t si = -1;
    
    result = si * ui;
    
    printf("%li", result);

    return 0;
}

现在,结果是

-1
。这里会发生什么?结果如何签名?

c type-conversion signed stdint
1个回答
0
投票

请参阅下面的代码(正如@Tom Karzes所说,

uint_fast16_t may be an ordinary unsigned int on some systems. In that case, %lu would be the wrong format.
我改变了我的答案):

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

int main()
{
    uint_fast16_t result;
    uint16_t ui = 1;
    int16_t si = -1;
    
    result = si * ui;
    printf("sizeof(result) is %zu\n", sizeof(result));
    printf("%li\n", result);
    printf("%ld\n", result);

    if(4 == sizeof(result)){
        printf("%u\n", result);
    }else if(8 == sizeof(result)){
        printf("%lu\n", result);
    }

    return 0;
}

运行它会输出(在64位计算机上):

sizeof(result) is 8
-1
-1
18446744073709551615

为什么相同的

result
输出不同?一个是 %li,另一个是 %lu。

因为这取决于你如何看待它,如

unsigned
signed

© www.soinside.com 2019 - 2024. All rights reserved.