首页 > 其他分享 >C温故补缺(一):数据类型和基本类型占位

C温故补缺(一):数据类型和基本类型占位

时间:2022-11-10 16:24:28浏览次数:39  
标签:int double float 数据类型 long rbp xmm0 占位 温故

数据类型

基本类型:就是算术类型,包括整型实型

枚举类型:一组离散的整数

void类型:无可用值类型

派生类型:指针(*),数组([]),结构体(struct),共用体(union),函数(fun())

基本类型占位

32位平台:

整型 实型
short:2 float:4
int:4 double:8
long:4

16位平台:

整型 实型
int:2 float:4
short int/short:2 double:8
long int/long:2 long double:16

所有的整形加上unsigned就是无符号数,范围加倍,占位不变

char占一个字节

数据类型的本质

数据的类型只是一个标签,人为规定他们存什么样的数据,但实际int long是一样的内存空间:都是4个字节,32位.char则是1个字节,8位,这8位可以存8个二进制位,至于它是什么值,是由编译器处理的.对于cpu来说,都是相同的二进制位.

在gcc编译器中,char,int,unsigned/signed,short,long等整型是直接存储其二进制位的,他们在表示数时只是长度和范围不同,还有以及规定的输出格式不同(%c和%d)

而float和double两个浮点型是用专门的标志标记其类型的

如:

int main(){
    char c='a';
    int a=1;
    int a1=2;
    int a2=3;
    float b1=4;
    float b2=5.5f;
    double b5=6;
    double b6=7.7f;
    return 0;
}

定义了char,int,float和double型的变量并赋值,看其汇编后的结果

    call    __main
    movb    $97, -1(%rbp)
    movl    $1, -8(%rbp)
    movl    $2, -12(%rbp)
    movl    $3, -16(%rbp)
    movss    .LC0(%rip), %xmm0
    movss    %xmm0, -20(%rbp)
    movss    .LC1(%rip), %xmm0
    movss    %xmm0, -24(%rbp)
    movsd    .LC2(%rip), %xmm0
    movsd    %xmm0, -32(%rbp)
    movsd    .LC3(%rip), %xmm0
    movsd    %xmm0, -40(%rbp)
    movl    $0, %eax
    addq    $80, %rsp
    popq    %rbp
    ret
    .seh_endproc
    .section .rdata,"dr"
    .align 4
.LC0:
    .long    1082130432
    .align 4
.LC1:
    .long    1085276160
    .align 8
.LC2:
    .long    0
    .long    1075314688
    .align 8
.LC3:
    .long    -1073741824
    .long    1075760332
    .ident    "GCC: (x86_64-posix-seh-rev0, Built by MinGW-W64 project) 8.1.0"

可以看到,char和int型在汇编时都是直接把操作数mov到bp寄存器的,也就是cpu可以直接操作其运算

而float和double则存在IP指令指针寄存器,并用LC标志其类型和内存对齐系数,也就是说,浮点数需要额外的指令来操作,并最终在Xmm寄存器运算

Xmm寄存器

XMM寄存器是一个完全独立的寄存器集,随SSE(浮点数指令集)一起引入,至今仍广泛使用。它们的宽度为128位,其指令可以将它们视为64、32(整数和浮点),16或8位(仅整数)值的数组。在32位模式下有8个,在64位模式下有16个。几乎所有浮点数学运算都是在64位模式下在SSE(以及XMM寄存器)中完成的

标签:int,double,float,数据类型,long,rbp,xmm0,占位,温故
From: https://www.cnblogs.com/Tenerome/p/Creview1.html

相关文章

  • 数据湖iceberg-day01-概念,特点,存储格式以及各种表中的演化,数据类型
    数据湖iceberg-day011.1什么是数据湖1.1.1什么是数据湖数据湖是一个集中式的存储库,允许你以任意规模存储多个来源、所有结构化和非结构化数据,可以按照原样存储数据,无......
  • ClickHouse 数据类型 (三)
    6、SummingMergeTree对于不查询明细,只关心以维度进行汇总聚合结果的场景。如果只使用普通的MergeTree的话,无论是存储空间的开销,还是查询时临时聚合的开销都比较大。ClickH......
  • Java数据类型拓展
    Java数据类型拓展publicclassDemo03{  publicstaticvoidmain(String[]args){    //整数拓展:进制 二进制0b 十进制 八进制0 十六进......
  • Java——数据类型转换:自动类型转换&强制类型转换
                             ==================================================================================......
  • 【JavaScript 教程】第二章基础知识03—JavaScript 数据类型
    英文 | https://www.javascripttutorial.net/译文|杨小爱在上节中,我们学习了JavaScript的变量,错过的小伙伴可以点击文章《​​【JavaScript教程】第二章基础知识02—Ja......
  • Sqlserver 导出表数据类型和字段详细信息
    USE[DatabaseName]goSETANSI_NULLSON;GOSETQUOTED_IDENTIFIERON;GO--=============================================--Description:<生成数据库......
  • JS基础+变量+数据类型
    js概述====≥使用方式js是什么=====》js是运行在浏览器/客户端上的一种编程语言,实现人机交互。js能做什么===》现在几乎是全能=〉数据交互,表单校验,app的开发,游戏开发,网......
  • Long数据类型序列化Json后传递给前端,产生的精度丢失的问题解决
    问题产生的原因Long类型的数据,如果我们在后端将结果序列化为json,直接传给前端的话,在Long长度大于17位时会出现精度丢失的问题。java中的long能表示的范围比js中number大,......
  • Day04.1数据类型拓展
    Java数据类型拓展篇整数拓展二进制的表示:数值前面加0bintnum1=10;//此值表示十进制的10intnum2=0b10;//此值表示二进制的10八进制的表示:数值前面加0intnum3=......
  • Java——基本数据类型
                    注意: 整型(int)常量默认在内存中占32位,是具有整数类型的值,当运算过程中所需值超过32位长度时,可以把它表示为长整......