2017-08-05 112 views
0

我想利用此文章更详细地了解如何对指针进行无符号和有符号的工作。我遇到的问题是,我必须使用opengl中的函数glutBitmapString,其参数为void*,而const无符号的char*.我试图将字符串转换为常量无符号的c_string如何将常量字符*转换为常量无符号字符*

尝试:

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

但是,由于新产生的c_str签订不安静的权利。我想远离铸造,因为我认为这会导致缩小误差。我认为unsigned char和signed char是几乎相同的东西,但都做了不同的映射。想到使用reinterpret_cast,但我不知道它是如何工作的。

+0

不错的阅读:[何时应该使用static_cast,dynamic_cast,const_cast和reinterpret_cast?](https://stackoverflow.com/questions/332030/when-should-static-cast-dynamic-cast-const-cast-and -reinterpre-cast-be-used) – user4581301

+0

reinterpret_cast已知是危险的。这是我想远离它。在这种情况下,reinterpret_cast是合理的,因为我必须投射一个指针,但是我不知道是否会得到相同的结果。 – TheMathNoob

+1

@ user4581301简短的回答:几乎从不。开玩笑。半开玩笑。 – Ron

回答

1

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

无符号字符* ==一个指针(无符号字符(S))

符号字符* ==一个指针(符号字符(S))

通常,没有一个是治疗0xFF的作为一个数字值,以及有符号与无符号无关紧要。并不总是这种情况,有时用字符串人们使用unsigned和signed来指代另一种类型......但是只要投射指针就可以保证安全。

如果您不安全投射指针,这意味着您指向的数据无效/格式错误。

要澄清无符号字符与符号的字符,检查了这一点: https://sqljunkieshare.files.wordpress.com/2012/01/extended-ascii-table.jpg

是炭0xA4正面还是负面的?它既不是。这是ñ。这根本不是数字。所以签名与无签名无关紧要。合理?

+0

它工作,所以它意味着投掷指针意味着投射它指向的元素。 – TheMathNoob

+0

总是。是。关于指针声明的一切,但是'*'告诉你它指向什么。 – zzxyz

+1

'0xA4'是一个整数值。如果它可以存储在一个'char'(这是不能保证的),它仍然是一个整数值。 – Peter

3

我会使用reinterpret_cast,这是一个罕见的情况严格的别名规则没有被打破。

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