使用 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!
答案 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。