2017-08-05 79 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)。

相關問題