我試圖轉換爲十進制的紅寶石和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表現得如此呢?
我試圖轉換爲十進制的紅寶石和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表現得如此呢?
校正:在C,字符常量是'j'
,不"j"
(字符串文字)
在C中,字符常數是int
型的,有106
(十進制整數)之間沒有差別,\152
(字符常數八進制)和'j'
(字符常量)。
在Ruby中,得到八進制字符串,使用Fixnum#to_s
:
129.to_s(8)
# => "201"
感謝您的回答俞昊,我知道這三種類型之間沒有區別,我知道如何轉換八進制。我的問題是,紅寶石如何像C一樣行事,當我投129到CHR它將直接將其轉換爲201. – hey 2015-02-09 08:03:54
@wirepin我不知道你如何在C中做它,因爲'(char)(129)'是一個右值,它只是一個值,它如何顯示在輸出取決於你如何打印它。至於Ruby,我認爲字符串文字使用的是十六進制格式而不是八進制格式,因爲它更容易使用並且不那麼令人困惑。 – 2015-02-09 08:14:07
@YuHao:mruby使用八進制而不是十六進制,不像我知道的所有其他實現。但是,如前所述,這並不重要,因爲它只是同一個字符串的不同表示。 – cremno 2015-02-09 18:55:48
讓我們開始與免責聲明:
什麼是由一些功能印刷無關與實際值。存儲的值與輸出值無關。
上面已經說過了,但我不得不再次說清楚。
現在讓我們來看看真實的東西。
我問你使用的代碼,因爲我知道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
有什麼區別嗎? '129 == 0201'和'0201 == 0x81' – Stefan 2015-02-09 08:44:21
您能否爲我們提供打印的實際C代碼?除非我知道你在這裏做什麼,否則我什麼都不會說。 – DallaRosa 2015-02-09 09:01:44
@Stefan是的,他們的輸出格式有所不同。 – hey 2015-02-10 02:29:39