c++ - 使用字符串格式限制十六进制数字的数量

标签 c++ formatting hex printf string-formatting

我在 4 个字符的项目中以十六进制显示值,因为该值是 16 位。在这种情况下,值也被签名,这就是我的问题所在。

我的代码:

int16_t i = -4;
printf("i = %04x\n", i);

输出:

i = fffffffc

我希望十六进制输出仅保留 16 位,而不是切换到 32 位表示形式。对于正值来说它是这样做的。

期望的输出:

i = fffc

是否有一种好的方法来指定十六进制数字的总数,或将输出锁定为与最小值相同? (理想情况下不必将值作为字符串进行操作:))

哦,我还认为这可能是编译器的问题,因为我第一次在 Visual C++ 中经历过它,但使用 GCC 进行测试在 Linux 下给出了相同的结果。

最佳答案

C 风格输出 printf()

说明符"%x"用于无符号整数。您的int16_t在调用中获取整数提升,以及有符号数 -4以二进制编码为整数 fffffffc那么就这样认为。

specifier "%x" 的问题也就是说,格式化字符串的大小和精度是最小位数。因此不可能强制格式化来截断输出。但是,您可以使用 binary-and 强制获得预期结果。 (运算符&):

printf("i = %04x\n", i & 0xffff);  // put as much f as digits you want to keep

C++ 风格输出

使用 C++ 流,您还可以使用 <iomanip> 格式化为十六进制:

cout<<setw(4)<< setfill('0')<<hex<<i<<endl;

ostream 不执行整数提升,仅使用您输出的值的类型。

Online demo

关于c++ - 使用字符串格式限制十六进制数字的数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47642218/

相关文章:

c - C %f 的 printf 在小数点后留下 6 个 0

c - 从C中的图像读取十六进制值

将 2 字节十六进制数转换回十进制

c++ - 当强制类型转换为完全不同的类时,static_cast的行为如何?

c++ - 我应该在 C++ 中的什么地方实现 operator =

C++子串多字节字符

java - 简单的输出问题

c++ - Eigen:将实数和虚数 MatrixXd 映射到 MatrixXcd

列表的子列表中第 j 个项目的 Python 最大长度

string - 如何将整数转换为没有 0x 的十六进制字符串(Julia 1.0)