回答
在像C這樣的語言中,信息總是以您解釋數據的方式「存儲」。編譯器添加了一些好處,它在一定程度上理解變量的類型並嘗試防止無意義的操作。
例如,假設你有位:0xFFFFFFFF
。如果你將它們解釋爲「32b unsigned int」,你會得到4294967295
。如果你將它們解釋爲「32b signed int」,你會得到-1
(*)。如果你把它們解釋爲雙重的,上帝知道你會得到什麼。
「如果你把它們解釋爲雙重的,上帝知道你會得到什麼。」問題,通常。 'double'往往是64位。如果你將它們解釋爲'float',如果使用IEEE754,則它是NaN。 – 2012-03-18 20:02:07
沒有地方,它只是由代碼假設。
需要注意的是,在其他語言(C++)中,有一個叫vtable的動態綁定,它包含了一些關於對象類型的信息。 – Mikhail 2012-03-18 19:48:54
@Misha這個問題是關於C,這就是爲什麼我沒有添加這個信息 – heinrich5991 2012-03-18 19:49:28
當C程序已經過去鏈接了,並且不需要在外面暴露任何符號時,這些數據就不再存在了。
數據類型與語言相關,當可執行文件準備就緒時,語言不再起作用,因爲現在它全部是內存和處理器。
C應用程序不存儲類型信息。唯一的執行是使用數據的方式。而在C中,濫用該強制措施是一件非常簡單的事情。
考慮以下幾點:
short s;
short *p = &s;
*(long*)p = 0;
此代碼需要一個指針到短變量,然後寫入該變量,就像它是一個長。這會覆蓋超出正在使用的變量所擁有的內存,導致未定義的行爲。
你可能是指'*(long *)&s'? – asaelr 2012-03-18 19:47:22
哎呀!是的,固定的。 – 2012-03-18 19:48:01
UB('(long)p'可能不對齊)。爲了這個例子,更好地切換開關。 – 2012-03-18 21:05:14
該信息未被存儲。例如,你可以做這樣的事情
int i=15;
char *p=(char*)&i;
char c=*p; //Now, c contain the first byte of 15, which may be 15 or 0
但不這樣做,除非你真的知道你會怎麼做。像這樣的東西不重要是錯誤的常見方式。
這爲什麼會出錯?如果我們printf(「%c」,c)會發生什麼; – 2012-03-18 19:58:56
@SharatChandra如果你知道自己在做什麼,那很好。只是如果有人不知道和做這樣的事情,通常是無稽之談。 – 2012-03-18 20:04:03
@SharatChandra就像丹尼爾寫道的那樣,當你知道自己在做什麼的時候,這很好,但即使在這個簡單的例子中,「c」可能是0或15.在更復雜的情況下,我們還需要小心對齊。 – asaelr 2012-03-18 21:33:07
- 1. 在C++中識別內存泄漏
- 2. C如何在內存中存儲不同的數據類型?
- 3. 無法識別數據庫中的數據類型nvarchar
- 4. 在SQLite中識別列的數據類型Android遊標
- 5. 如何識別R中數據框中的變量類型?
- 6. 在C中存儲數據類型
- 7. 如何在執行存儲過程後識別數據類型?
- 8. 在C++中,枚舉數據類型消耗多少內存?
- 9. postgresql,無法識別記錄數據類型中的列
- 10. 如何識別圖像中存在的噪音類型
- 11. C中的數據類型
- 12. 在C#中創建F#已識別的聯合類型
- 13. C++:識別物體的類型
- 14. LINQ到數據:聰明類型識別
- 15. JdbcTemplate如何識別數據類型?
- 16. PostgreSQL:如何識別數據類型?
- 17. Java - 識別值類型的模式
- 18. 如何讓內存存取類型的C/C++在Linux中
- 19. Linux:識別內存中的頁面
- 20. 識別Windows中的文件類型
- 21. 識別模板中的基元類型
- 22. 識別lme4模型中的異常值
- 23. 在JSP中,如何識別列表中存在的對象的類型?
- 24. 整數類型可以在C++中存儲的值的範圍
- 25. 在Python中識別數據庫中的類似字符串
- 26. 參考值的「類型」存儲在內存中的位置?
- 27. 更改已存在的SharedPreference值中的數據類型
- 28. 無法識別的類型
- 29. 識別滾動的類型
- 30. 何時爲c#中的值類型分配內存?
另請參見[此複製](http://stackoverflow.com/questions/39206296/how-does-memory-determine-data-type-of-variable)這也吸引了一些很好的答案。 – 2016-08-30 01:05:36