C语言转换不清楚

Iva*_*eia 0 c casting

我很惊讶为什么得到不同的结果。

    uint16_t wCaptureTime = 35;

    wDeltaTime1 = (uint16_t) - (int16_t)wCaptureTime;
    wDeltaTime2 =  0xFFFF - (int16_t)wCaptureTime;

    printf("wDeltaTime1 %d \n", wDeltaTime1);
    printf("wDeltaTime2 %d \n", wDeltaTime2);
Run Code Online (Sandbox Code Playgroud)

该代码导致:

wDeltaTime1 65501 
wDeltaTime2 65500 
Run Code Online (Sandbox Code Playgroud)

有人可以解释或提供一些链接以了解该行为。

Bat*_*eba 6

(uint16_t)表达式中的(uint16_t) - (int16_t)wCaptureTime是一个铸件。什么时候-35投向uint16_t-35 + 65536,那是65501

如果sizeof(int)是2,则0xFFFF - (int16_t)wCaptureTime65535 - 35unsigned算术这是65500。如果sizeof(int)为4,则将获得相同的结果,尽管该表达式将以有符号(int)算术求值。