如何将值存储在c中的不同数据类型中

Man*_*tti 2 c

我想知道数据类型是如何存储在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

谁能解释为什么会这样?以及不同的数据类型如何在内存中存储值?提前致谢

Bas*_*tch 8

我想知道数据类型如何存储在C中

迂腐,这没有任何意义.数据的存储方式是一个实现细节(C99C11标准没有定义数据的存储方式),原则上你不应该费心去尝试编写可移植的代码.

实际上,数据如何存储和表示,以及如何在函数调用等中传输数据,在名为Application Binary Interface的文档中指定.这些约定特定于处理器,通常是操作系统,后面是编译器(和其他工具).

请注意,某些数据可能不在内存中,但仅限于寄存器中.

您可以阅读两个补码,指令集,x86,调用约定,x86调用约定,处理器寄存器,地址空间,虚拟内存,字节序,数据结构对齐,整数(计算机科学),浮点,IEEE浮点数等的wikipages. ...

对于x86-64 Linux,您可以阅读其ABI规范.

实际上,数据表示具有强烈的机器和系统特定性.它在您的ARM/Android平板电脑和Linux/x86-64桌面以及Arduino套件或IBM System Z大型机上是不同的(因此您的程序会对这些产生不同的结果).

请注意,C99为您提供了<stdint.h>与标准的类型如int32_t,uint64_t,intptr_t

如果您关心互操作性,请阅读有关序列化的更多信息,并支持明确定义的文本格式(例如JSON).