Cout不能打印数字

16

问题

我使用简单的cout语句没有输出,而printf总是会输出数字:

std::cout << variableuint8;  // prints nothing
printf("%u", variableuint8); // prints the number

我之前从未遇到过这种行为,虽然我有一个解决方法,但我希望理解它。

上下文:

哎呀,指针。因此,情况可能比所述的要复杂一些。这是背景-我认为这并不重要,当cout和printf获取信息时,它被解引用为简单的无符号字符。这可能是解决问题所需的更多信息,但我想尽可能详细地说明,以防它与问题相关。

typedef unsigned char   UInt8;
typedef unsigned short  UInt16;

typedef struct{
   UInt8   len;
   // some other definitions. sizeof(DeviceNotification) <= 8
}DeviceNotification;

UInt8 somerandomdata[8];
DeviceNotification * notification;

notification = (DeviceNotification *) somerandomdata;

std::cout << "Len: (" << notification->len << ")\n";
printf("Len: (%u)\n", notification->len);

随机数据已在其他地方初始化。对于这个输出,数组中的第一个字节是0x08:

输出:

Len: ()
Len: (8)

环境

  • 开发机器:
    • 操作系统: OS X 10.6.8
    • 编译器: LLVM 1.7
    • Xcode 版本: 3.2.6
  • 测试机器:
    • 操作系统: OS X 10.6.8

我只是想问,以下代码行是否在C++中定义? notification = (DeviceNotification *) somerandomdata; 如果对齐不符合 DeviceNotification 所需的对齐方式,这行代码难道不会引起未定义的行为吗? - Khaled Alshaya
@AraK 这些程序在x86上运行,可以进行不对齐的内存访问。尽管可能需要读取内存总线两次才能获得跨越边界的值,但它们完全可以正常工作。您可以进行一些实验来证明这一点-如果您这样做,请告诉我们是否存在速度差异。 - Adam Davis
谢谢,这很有趣。写一个这样的微基准测试会很不错。 - Khaled Alshaya
即使在有严格对齐要求的机器上,这些要求通常只适用于基本类型而不是结构体。特别地,访问字节大小的成员(例如 UInt8 len)是安全的。 - MSalters
3个回答

12

它将char作为字符打印出来。

#include <iostream>

int main() {
        unsigned char c = 0x41;
        std::cout << c << std::endl;
        return 0;
}

这将把 'A' 打印到标准输出流(stdout)。

虽然在这种情况下,你的代码应该打印 Len: (*),我已经验证它打印了 Len: (*)


编辑:由于在像ASCII或UTF-8这样的字符编码中,您的控制台可能不可见8(退格)对应的字符,因此它看起来好像没有被打印出来。

(在某些情况下,它可能会导致先前的字符(括号()消失,因为它是一个退格字符。在DOS中,它可能显示为◘)


那就是问题所在。你说得对,我的示例输出是不正确的 - 我已经更改了它以展示我实际遇到的问题。 - Adam Davis
它不是真实的点。这个示例程序应该打印出42*),但它没有。 - eugene_che
@tyz 我在我的示例中犯了一个错误 - Kenny是正确的。我已经修改了我的示例,使用了我要处理的实际值。对于造成的困惑,我表示抱歉。 - Adam Davis

4

您是否尝试将其转换为整数,以避免依赖于实现所使用的字符类型:

std::cout << (int)variableuint8;

这里是关于正在进行的事情的解释:什么是unsigned char? 为了让您有一个想法,您的实现将unsigned char用作char。 0x08的ASCII码是退格控制字符,当然它不是可打印字符,这就是为什么在使用std :: cout的情况下您看不到输出的原因。

std::cout << +variableuint8; 这样写会更简单。 - phuclv

3
< p > 这段代码 std::cout << "Len: (" << (unsigned short)notification->len << ")\n"; 会输出正确的值吗?我猜你可能需要将它转换为整数。


是的,这是正确的修正方式。在我的情况下,我进行了强制类型转换 (UInt16),但效果是相同的。 - Adam Davis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接