我想知道数据类型是如何存储在c中的,所以我编写了一个程序来检查值的存储方式.当我看到输出时,我无法理解内存中不同数据类型的存储值.
这是我试过的程序,
#include <stdio.h>
int main() {
int x;
int valI, i;
short valS;
long valL;
signed valSi;
unsigned valUn;
// printf("enter a num");
// scanf("%d",&x);
x = -10;
valI = x;
valS = x;
valL = x;
valSi = x;
valUn = x;
printf("\n\t%i\t%li\n",valI,sizeof(valI));
for(i = 8*sizeof(valI); i >= 0 ; i--)
{
printf("%i",(valI & (1<<i))? 1 : 0);
}
printf("\n\t%i\t%li\n",valS,sizeof(valS));
for(i = 8*sizeof(valS); i >= 0 ; i--)
{
printf("%i",(valS & (1<<i))? 1 : 0);
}
printf("\n\t%li\t%li\n",valL,sizeof(valL));
for(i = 8*sizeof(valL); i >= 0 ; i--)
{
printf("%i",(valL & (1<<i))? 1 : 0);
}
printf("\n\t%i\t%li\n",valSi,sizeof(valSi));
for(i = 8*sizeof(valSi); i >= 0 ; i--)
{
printf("%i",(valSi & (1<<i))? 1 : 0);
}
printf("\n\t%i\t%li\n",valUn,sizeof(valUn));
for(i = 8*sizeof(valUn); i >= 0 ; i--)
{
printf("%i",(valUn & (1<<i))? 1 : 0);
}
printf("\n\n");
}
Run Code Online (Sandbox Code Playgroud)
输入的输出= 10
enter a num10
10 4
000000000000000000000000000001010
10 2
00000000000001010
10 8
00000000000000000000000000000101000000000000000000000000000001010
10 4
000000000000000000000000000001010
10 4
000000000000000000000000000001010
输入的输出= -10
enter a num-10
-10 4
011111111111111111111111111110110
-10 2
11111111111110110
-10 8
01111111111111111111111111111011011111111111111111111111111110110
-10 4
011111111111111111111111111110110
-10 4
011111111111111111111111111110110
谁能解释为什么会这样?以及不同的数据类型如何在内存中存储值?提前致谢
我想知道数据类型如何存储在C中
迂腐,这没有任何意义.数据的存储方式是一个实现细节(C99或C11标准没有定义数据的存储方式),原则上你不应该费心去尝试编写可移植的代码.
实际上,数据如何存储和表示,以及如何在函数调用等中传输数据,在名为Application Binary Interface的文档中指定.这些约定特定于处理器,通常是操作系统,后面是编译器(和其他工具).
请注意,某些数据可能不在内存中,但仅限于寄存器中.
您可以阅读两个补码,指令集,x86,调用约定,x86调用约定,处理器寄存器,地址空间,虚拟内存,字节序,数据结构对齐,整数(计算机科学),浮点,IEEE浮点数等的wikipages. ...
实际上,数据表示具有强烈的机器和系统特定性.它在您的ARM/Android平板电脑和Linux/x86-64桌面以及Arduino套件或IBM System Z大型机上是不同的(因此您的程序会对这些产生不同的结果).
请注意,C99为您提供了<stdint.h>与标准的类型如int32_t,uint64_t,intptr_t
如果您关心互操作性,请阅读有关序列化的更多信息,并支持明确定义的文本格式(例如JSON).