返回介绍

4. 类型转换

发布于 2024-10-12 21:58:08 字数 1867 浏览 0 评论 0 收藏 0

不同类型操作数可出现在一个表达式内,由编译器进行隐式转换。

通常认为 C 是静态弱类型语言,在编译期检查类型,但不算严格,且支持隐式转换。

转换类型:

  • 表达式操作数类型不同。
  • 变量赋值类型不同。
  • 实参与形参类型不同。
  • 返回值类型不同。
  • 零值和 NULL 视为 false,其余为 true。
  • 输出(printf)格式( %d )。
int x = 1.5;     // 赋值转换。
assert(x == 1);
int a = 1;
float b = 1.5;
int x = a + b;   // 表达式操作数转换。
void test (int x)
{
    printf("%d\n", x);
}

int main (void)
{
    test(1.5);   // 参数转换。
    return 0;
}
int test (float x)
{
    return x;    // 返回值转换。
}

优先级:

long double > double > float >
    long long > long > int > short > char > _Bool
  • 位宽的整数等级更高。
  • 浮点数等级高级整数。
  • 有符号整数和其无符号整数等级相同。
  • 枚举与其对应的整数类型等级相同。

操作数类型不同时,转换为优先级最高的类型。

float     a = 1.0;
long long b = 1;

assert(sizeof(b - a) == 4);
float     a = 1.5;
long long b = 1;
int       c = 2;

assert(sizeof(a + b + c) == 4);   // float + longlong + int --> float

当有符号类型不足以存储时,转换为无符号类型。

long          a = -1;
unsigned long b = 2;

assert(a > b);         // long 不足以存储 ulong 值,(unsigned long)a > b

整数提升

如表达式操作数低于 int,则先提升为 int 再计算。

使用 int 可提升性能,还能避免溢出错误。

char           c = '?';
unsigned short x = 100;

if (c < 'A')   // 'A' int, c: char -> int

x = x + 1;     // 加法前,x: ushort -> int/uint
char      a = 'a';
short     b = 1;
long long c = 2;

assert(sizeof(a - b) == 4);  // int
assert(sizeof(c - b) == 8);  // long long

显式转换

也可以 (type)(expression) 方式 强制转换 类型。

优先级高于算术操作符。

只要可能丢失信息,就应该显式强制转换。

int x = (int)1.2;
assert(x == 1);

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文