Cout 不打印号码
Posted
技术标签:
【中文标题】Cout 不打印号码【英文标题】:Cout not printing number 【发布时间】:2011-12-25 07:54:06 【问题描述】:问题
我没有从一个简单的 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
的必需对齐,此行不会调用未定义的行为吗?
@AraK 这些在 x86 上运行,允许未对齐的内存访问。它们可能更慢,因为它们可能需要两次读取内存总线才能获得跨边界拆分的值,但它工作得很好。您可以进行一些实验来证明这一点 - 如果您这样做了,请告诉我们是否存在速度差异。
谢谢,这很有趣。能写出这样一个微基准就好了。
即使在有严格对齐要求的机器上,这些往往也适用于基本类型而不是结构。特别是,访问字节大小的成员(例如UInt8 len
)是安全的。
【参考方案1】:
std::cout << "Len: (" << (unsigned short)notification->len << ")\n";
会打印正确的值吗?我猜想转换为整数可能是要找的。p>
【讨论】:
是的,这是正确的解决方法。就我而言,我投了(UInt16)
,但效果是一样的。【参考方案2】:
它将char
打印为一个字符。
#include <iostream>
int main()
unsigned char c = 0x41;
std::cout << c << std::endl;
return 0;
这会将“A”打印到标准输出。
虽然在这种情况下,您的代码应该打印Len: (*)
,而且我确实已经验证它打印Len: (*)
。
编辑:由于在您的控制台可能使用的字符编码(如 ASCII 或 UTF-8)中,对应于 8(Backspace)的字符是不可见的,它看起来好像没有打印出来。
(在某些情况下,它可能会导致前一个字符((
)消失,因为它是一个退格字符。在 DOS 中它可能会显示 ◘)
【讨论】:
这就是问题所在。关于我的示例输出不正确,您是对的 - 我已经对其进行了更改以演示我实际遇到的问题。 这不是一个真正的观点。示例程序应该打印42
(*
),但它没有。
@tyz 我在我的例子中犯了一个错误——肯尼是正确的。我已经用我正在处理的实际值修改了我的示例。很抱歉造成混乱。【参考方案3】:
您是否尝试将其转换为 int,以避免依赖于实现所使用的 char 类型:
std::cout << (int)variableuint8;
这里是对发生的事情的解释:What is an unsigned char?
为了了解一下,您的实现使用unsigned char
作为char
。 0x08 的 ASCII 码是退格控制字符,当然它不是可打印字符,这就是为什么在 std::cout
的情况下看不到输出的原因。
【讨论】:
std::cout << +variableuint8;
会更简单以上是关于Cout 不打印号码的主要内容,如果未能解决你的问题,请参考以下文章