c中的unsigned int数据类型

use*_*282 3 c types implicit-conversion

请帮我区分C中的这些代码:

代码1:

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

uint8_t fb(int a)
{
    return -3;
}

int main()
{
    int a = fb(-3);
    printf("%d",a);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

代码2:

#include<stdio.h>

unsigned int fb(int a)
{
    return -3;
}

int main()
{
    int a = fb(-3);
    printf("%d",a);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

问题是第一个代码按预期返回253但第二个代码返回-3,这是意外的,因为返回类型是无符号的.请帮帮我这是怎么回事?

我用过mingw gcc编译器.

ike*_*ami 9

在第一个程序中,

  1. 当函数返回时,int-3(FFFFFFFD)被转换uint8_t为253(FD).高阶字节被丢弃,因此它适合.
  2. 当执行分配时,uint8_t253(FD)int通过符号扩展转换为253(000000FD).

在第二个节目中,

  1. 当函数返回时,int-3(FFFFFFFD)强制转换为unsigned int4294967293(FFFFFFFD).不需要删除任何字节.
  2. 执行赋值时,转换为unsigned int4294967293(FFFFFFFD)int为-3(FFFFFFFD).

笔记:

  • 假设32位整数,但它与64位整数类似.
  • 这是对你发生的事情的解释; 它不一定是C规范要求发生的事情.

  • 我无法理解你的观点.你能用更多的例子来详细说明吗?真的很感激所有人? (3认同)
  • 没有提到规则,例外,其他平台,解释,什么? (3认同)