2015-02-09 28 views
0

我試圖轉換爲十進制的紅寶石和C到燒焦的結果如下:在紅寶石中鑄造焦炭是不同的?

In Ruby: 129.chr is equals to "\x81" 
     : 106.chr is equals to "j" 

In C : (char)(129) is equals to "\201" 
     : (char)(106) is equals to "j" 

爲什麼用C轉換129時,事實證明,它轉換129到它的價值十月?有沒有什麼辦法可以讓ruby表現得如此呢?

+0

有什麼區別嗎? '129 == 0201'和'0201 == 0x81' – Stefan 2015-02-09 08:44:21

+1

您能否爲我們提供打印的實際C代碼?除非我知道你在這裏做什麼,否則我什麼都不會說。 – DallaRosa 2015-02-09 09:01:44

+0

@Stefan是的,他們的輸出格式有所不同。 – hey 2015-02-10 02:29:39

回答

2

校正:在C,字符常量是'j',不"j"(字符串文字)

在C中,字符常數是int型的,有106(十進制整數)之間沒有差別,\152(字符常數八進制)和'j'(字符常量)。

在Ruby中,得到八進制字符串,使用Fixnum#to_s

129.to_s(8) 
# => "201" 
+0

感謝您的回答俞昊,我知道這三種類型之間沒有區別,我知道如何轉換八進制。我的問題是,紅寶石如何像C一樣行事,當我投129到CHR它將直接將其轉換爲201. – hey 2015-02-09 08:03:54

+0

@wirepin我不知道你如何在C中做它,因爲'(char)(129)'是一個右值,它只是一個值,它如何顯示在輸出取決於你如何打印它。至於Ruby,我認爲字符串文字使用的是十六進制格式而不是八進制格式,因爲它更容易使用並且不那麼令人困惑。 – 2015-02-09 08:14:07

+0

@YuHao:mruby使用八進制而不是十六進制,不像我知道的所有其他實現。但是,如前所述,這並不重要,因爲它只是同一個字符串的不同表示。 – cremno 2015-02-09 18:55:48

0

讓我們開始與免責聲明:

什麼是由一些功能印刷無關與實際值。存儲的值與輸出值無關。

上面已經說過了,但我不得不再次說清楚。

現在讓我們來看看真實的東西。

我問你使用的代碼,因爲我知道C不像紅寶石,你只是做print 129和事情成功就好了。 C函數的printf低於

int printf (const char * format, ...); 

簽名這意味着你不能僅僅通過數(或字符變量)一樣,和C會做的魔力爲你。您實際上必須將該格式作爲字符串傳遞,然後將值注入到那裏。

其實我試過你說的只是被真正知道我在說什麼的緣故:你得到的唯一事情是Segmentation Fault 11

不過,我確實發現一些有趣的東西在那裏:

以下是一塊的代表在C和它的輸出相同的值的一些不同的方式代碼:

https://gist.github.com/dallarosa/412235a6101e5fda3bed

$ ./test_printf 
---- 
(char)129 
---- 
char: � 
octal: 37777777601 
hexa: ffffff81 
unsigned: 4294967169 
binary: 11111111111111111111111110000001 
---- 
129 
---- 
char: � 
octal: 201 
hexa: 81 
unsigned: 129 
binary: 00000000000000000000000010000001 

該編譯器將char定義爲帶有一個字節大小的帶符號類型,當您將129轉換爲字符時,您最終得到負值。

FIY,這是一個Macbook Pro與OS X 10.9.5