【问题标题】:How do I cast a const char* to a const unsigned char*如何将 const char* 转换为 const unsigned char*
【发布时间】:2017-08-05 00:13:09
【问题描述】:

我想利用这篇文章更详细地了解无符号和有符号指针是如何工作的。我遇到的问题是我必须使用 opengl 中的一个名为 glutBitmapString 的函数,该函数将 void* 和 const unsigned char*. 作为参数,我正在尝试将字符串转换为 const unsigned c_string

尝试:

string var = "foo";
glutBitmapString(font, var.c_str());

但是,这并不安静,因为新生成的 c_str 已签名。我想远离铸造,因为我认为这会导致缩小错误。我认为 unsigned char 和 signed char 几乎是同一件事,但两者都做了不同的映射。想到使用 reinterpret_cast,但我不知道它是如何工作的。

【问题讨论】:

  • reinterpret_cast 被认为是危险的。那是我想远离它。在这种情况下,reinterpret_cast 是合理的,因为我必须转换一个指针,但我不知道我是否会得到相同的结果。
  • @user4581301 简短回答:几乎从不。开玩笑。半开玩笑。
  • reinterpret_cast, @Ron?同意。只有在绝对不可避免的情况下。吸盘是上帝的锤子。它将使圆圈适合方孔,并且程序可能会因此行为不端。为此,有点取决于。 ASCII 仅定义为 127,因此有符号和无符号无关紧要。如果您有扩展的 ASCII 码,则存在解释错误的余地。

标签: c++ opengl glut


【解决方案1】:

我会使用reinterpret_cast:

glutBitmapString(font, reinterpret_cast</*const*/unsigned char*>(var.c_str()));

严格的别名规则没有被打破是一种罕见的情况。

负值将被解释为无符号(所以值 + 256)。

【讨论】:

    【解决方案2】:

    在这种特殊情况下(以及几乎所有其他情况),有符号与无符号是指指针指向的内容。

    unsigned char* == 指向 (unsigned char(s)) 的指针

    signed char* == 指向 (signed char(s)) 的指针

    一般来说,根本没有人将 0xFF 视为数值,有符号与无符号并不重要。并非总是如此,有时对于字符串,人们会草率地使用 unsigned 与 signed 来引用一种类型而不是另一种类型......但你可能只是投射指针是安全的。

    如果您不安全地转换指针,则意味着您指向的数据无效/格式错误。

    要澄清 unsigned char 与 signed char 的区别,请查看以下内容: https://sqljunkieshare.files.wordpress.com/2012/01/extended-ascii-table.jpg

    char 0xA4 是正数还是负数?两者都不是。这是ñ。这根本不是一个数字。所以签名与未签名并不重要。有道理?

    【讨论】:

    • 它起作用了,所以这意味着转换指针意味着转换它指向的元素。
    • 总是。是的。除了 * 之外,关于指针声明的所有内容都会告诉您它指向的内容。
    • 0xA4 是一个整数值。如果它可以存储在char 中(不能保证),它仍然是一个整数值。
    • @Peter:0xA4 是位模式的表示。事实上,它更自然地代表了一个整数值,这是一个不幸的巧合,也是我们沟通方式的限制。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-29
    相关资源
    最近更新 更多