我想输入一个文本字符串ffff公司整数16_t,该值应为-1.

下面是一个简单的测试C++程序:

#包括<iostream>#包括<iomanip>#包括<stdint.h>整型main(){int16_t编号;std::cout<<“输入十六进制数:”;标准::cin>>标准::hex>>编号;std::cout<<“十进制表示:”<<num<<std:∶endl;返回0;}

以下是该计划的结果:

输入十六进制数:ffff十进制表示:32767

你看,结果值32767是的最大值整数16_t.

所以,我猜这条线std::cin>>std::hex>>数字;不支持二的补码十六进制格式的符号?

8
  • 这是正确的行为。提取器读取类型为的值长的。由于结果太大,无法放入整数16_t它存储最大可表示值并将流设置为错误状态。请参见在这里详细信息,尤其是第12项。 评论 2023年5月24日0:45
  • 1
    尝试标准::cin>>标准::hex>>重新解释广播<uint16_t&>(num);
    – 水田
    评论 2023年5月24日0:50
  • 谢谢,对于第12项,你是指那条线吗提取可能跳过前面空白的短值。。你的意思是,对于一个十六进制字符串,提取器只能得到一个正值吗?即使十六进制字符串也表示负值。 评论 2023年5月24日0:51
  • 嗨,@padid你的方法管用!谢谢。所以,基本上我认为>>如果输入字符串是十六进制字符串,则运算符只能读取正值。 评论 2023年5月24日1:19
  • 1
    正确,因为ffff公司是一个积极的整数。同样,如果你是以10为底,你也不会期望得到这个值65535被认为是负面的。相反,这些值超过了可以用16位有符号整数表示的最大值。因此,根据皮特·贝克尔提供的文档链接,截断规则适用。
    – 稻田
    评论 2023年5月24日2:55

1答案1

重置为默认值
0

此外,为了解决这个问题,您可以将num转换为uint16_t,然后在使用时将num强制转换为int16_t。

uint16_t编号;标准::cin>>标准::hex>>编号;标准::cout<<(int16_t)num;返回0;
1
  • 是的,这很管用。实际上,我有一个整数16_t要填充的变量。我认为帕迪的评论可以改善你的回答。你能把它加到你的答案里吗?谢谢。 评论 2023年5月24日1:22

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.