【问题标题】:How to convert int to short int in C?如何在C中将int转换为short int?
【发布时间】:2021-01-17 20:27:25
【问题描述】:

假设我有一个char array[5] = {'1','2','3','4','\0'};

如果我想要整数,我可以简单地使用 atoi() 函数:
int num = atoi(array);

如何将值检索为 short/short int?

当然,它的值适合短。

我需要打电话给atoi() 并通过位移来解决吗? 不过我不太熟悉。

【问题讨论】:

  • short int num = atoi(array);。当然,这取决于当数字超出短整数范围时您想要做什么,这将改善描述该问题的问题
  • 哦,好的,当然。当我有一个负 int 并且我希望 short 也为负时,这不会失败吗?
  • 也适用于负数。
  • 否(只要值在短整数范围内)

标签: c integer bit-shift short atoi


【解决方案1】:

没有 ascii to short 函数,https://en.cppreference.com/w/c/string/byte/atoi 仅列出 atoi for ascii to intatol for ascii to longatoll for ascii to long long

但您可以使用atoi 转换为int,然后只需转换为short。当然这不会检查数字是否在short 的范围内。您可能需要使用SHRT_MIN <= i && i <= SHRT_MAX 之类的内容自行检查。

int num = atoi(array);
short s = (short)num;

或者直接转换:

short s = (short)atoi(array);

正如其他人建议的那样,您不需要显式强制转换,但它可能有助于更好地了解这里发生了什么。

short s = atoi(array);  // Implicit cast

【讨论】:

  • 强制转换是不必要的,因为存在隐式转换
  • 最好有某种溢出检查,不过
  • 顺便说一句,在 C++ 中也没有必要
  • @M.M 这是真的,完整的答案应该提到这一点,但是明确的演员表显示了意图并且不太可能被后续维护者“修复”。例如,大多数静态分析工具会在分配给较小的类型时标记警告,维护者可能会通过错误地更改类型而不是应用显式转换来解决它。
  • @WernerHenze 您应该保留显式转换并添加隐式转换示例作为第三个(可能是不明智的)选项。如上所述,您可能会出于某些原因使用显式强制转换。
【解决方案2】:

比简单演员更安全的版本。

#include <stdlib.h>
#include <limits.h>

short getshort(const char *num, int *errcode) 
{    
    int result = atoi(num);

    if(errcode)
    {
        *errcode = 0;
        if(result > SHRT_MAX) *errcode = 1;
        else if(result < SHRT_MIN) *errcode = -1;
    }
    return result;
}

【讨论】:

  • 经过反思,尽管我在其他地方有我的 cmets,但在这种情况下这是有优点的。与 atoi 转换相比,范围检查的开销微不足道。在一般情况下,您可能不希望它检查所有 int 到 short 的转换;有时,通过前置条件保证,强制转换在语义上是安全的。 num是否是可以转为int的字符串还是个问题。如果这是假设的,我认为遵循 atoi 语义没有问题,如果转换失败则简单地返回零。所以一个: int atoshrt( const char* ).
  • @Clifford 返回零不会通知调用者该值无效。如果编译器将内联传递 NULL 的代码将不会增加开销 godbolt.org/z/Pce948
  • 我知道;你错过了我的意思。如果 atoi() 返回是可以接受的,那么具有相同语义的衬衫版本是可以接受的。如果 atoi() 失败,则不会报告错误。内联不会消除错误检查的开销,但是您再次错过了我的观点,即在这种情况下可以忽略不计。
猜你喜欢
  • 2013-01-19
  • 1970-01-01
  • 2012-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-08
  • 1970-01-01
相关资源
最近更新 更多