C ++如何使用scanf函数读取__int16_t整数

时间:2017-03-23 08:22:58

标签: c++ scanf

使用 scanf 读取指定的宽度整数。

#include <cstdio>

using namespace std;

int main(){
   __int16_t a;
   __int32_t b;
   scanf("%d %d", &a, &b)
   return 0;
}

有一个编译器警告格式说明符&#34;%d&#34;需要&#39; int *&#39; arg而不是&#39; __ int16_t *&#39; 那怎么解决呢? 不允许使用BTW C ++ 11!

3 个答案:

答案 0 :(得分:2)

标准std::scanf仅支持标准类型。除非您的标准库记录了允许使用非标准类型的格式说明符,否则您不能使用它来读取非标准类型。如果有,那么只需按照他们的文档。

您可以尝试先扫描标准类型,然后屏蔽额外的位(如果有的话),然后进行转换。如果输入不会溢出预期的目标类型,则掩蔽是多余的。

long temp_a, temp_b; // could use short or int for temp_a
std::scanf("%ld %ld", &temp_a, &temp_b);
__int16_t a = temp_a & 0xffff;
__int32_t b = temp_b & 0xffffffff;

为了完整性,如果可以使用C ++ 11,它们具有标准的固定宽度类型:

std::int16_t a;
std::int32_t b;
std::scanf("%" PRId16 "%" PRId32, &a, &b)

或者,如果您的流媒体库有非标准类型的重载,请使用std::cin。这样你就可以处理无效的输入。

答案 1 :(得分:0)

__int16_t可能是(编译器特定的)类型,是16位有符号整数。 scanf()通常不支持这种特定于编译器的类型(如果需要,它将需要特定于编译器和库的格式说明符)。

在下文中,我假设一个编译器支持__int16_t作为16位有符号整数类型,而scanf()没有提供任何方法来读取它。

 long int some_int;    //  range at least [-2147483647,2147483647]
 __int16_t a;
 if (scanf("%ld ", &some_int) == 1)
 {
      //   report error if some_int outside range a __int16_t can represent

      a = some_int;
 }
 else
 {
       // an error occurred
 }

我不会在上面使用int%d格式说明符,因为C ++标准只需要int才能表示{{1}的范围1}}到-32767(虽然允许更大的范围)。可以想象,编译器的32767可以表示范围int-32678,但32767表示范围__int16_t-32767。在此类设置中,如果上述代码使用32768而不是32768,则可能无法正确处理int的输入。

就我个人而言,我可能会尝试使用C ++ long int(例如istream)代替C std::cin >> a,因为实际上,很可能会工作。原因是,如果支持类似scanf()的类型的实现,那么在__int16_t中包含支持的努力少于在istream中支持它的工作。

答案 2 :(得分:-5)

对__int16_t使用'%d'。我不知道'__int24_t'存在。更多信息:How to use int16_t or int32_t with functions like scanf