回答
在像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