C温故补缺(一):数据类型和基本类型占位
数据类型
基本类型:就是算术类型,包括整型和实型
枚举类型:一组离散的整数
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寄存器)中完成的
C温故补缺(一):数据类型和基本类型占位的更多相关文章
- 由js apply与call方法想到的js数据类型(原始类型和引用类型)
		原文地址:由js apply与call方法想到的js数据类型(原始类型和引用类型) js的call方法与apply方法的区别在于第二个参数的不同,他们都有2个参数,第一个为对象(即需要用对象a继承b, ... 
- MySQL日期数据类型、时间类型使用总结
		MySQL日期数据类型.时间类型使用总结 MySQL日期数据类型.MySQL时间类型使用总结,需要的朋友可以参考下. MySQL 日期类型:日期格式.所占存储空间.日期范围 比较. 日期类型 ... 
- ABAP基本数据类型、通用类型
		声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ... 
- MySQL数据库数据类型之集合类型SET测试总结
		MySQL数据库提供针对字符串存储的一种特殊数据类型:集合类型SET,这种数据类型可以给予我们更多提高性能.降低存储容量和降低程序代码理解的技巧,前面介绍了首先介绍了四种数据类型的特性总结,其后又分别 ... 
- Delphi 基本数据类型列表 高级数据类型列表 字符类型查询列表清单
		原文:Delphi 基本数据类型列表 高级数据类型列表 字符类型查询列表清单 长长的列表文字类型文件 分类 范围 字节 备注 简单类型 序数 整数 Integer -2147483648 .. 214 ... 
- MySQL (二)--  数据类型(列类型)、数值类型、 小数类型、 时间日期类型、 字符串类型 、 MySQL记录长度、列属性
		1 数据类型(列类型) 所谓的数据类型:对数据进行统一的分类,从系统的角度出发是为了能够使用统一的方式进行管理,更好的利用有限的空间. SQL中将数据类型分成了三大类: 2 数值类型 数值类型数据:都 ... 
- redis数据类型-散列类型
		Redis数据类型 散列类型 Redis是采用字典结构以键值对的形式存储数据的,而散列类型(hash)的键值也是一种字典结构,其存储了字段(field)和字段值的映射,但字段值只能是字符串,不支持其他 ... 
- Mysql 数据类型、约束类型
		mysql数据类型 MySQL中定义数据字段的类型对你数据库的优化是非常重要的. MySQL支持多种类型,大致可以分为三类:数值.日期/时间和字符串(字符)类型. 数值类型 MySQL支持所有标准 ... 
- go数据类型之基本类型
		基本数据类型 数值型 整数 int 64位操作系统默认为int64,32位操作系统为int32,但是类型检查时时int int8 (byte 1字节) int16 (short 2字节) int32 ... 
- Java基础之基本数据类型的包装类型
		Java的基本数据类型的包装数据类型有多种: int Integer,short Short,boolean Boolean,float Float,double Double等等. Java包装类数 ... 
随机推荐
- MySQL8 Group By 新特性
			MySQL8 Group By 新特性 此生此夜不长好,明月明年何处看. 一.简介 MySQL8 新特性之 Group By 不再隐式排序.MySQL8对于group by 字段不再隐式排序,如需 ... 
- Java 热更新 Groovy 实践及踩坑指南
			Groovy 是什么? Apache的Groovy是Java平台上设计的面向对象编程语言.这门动态语言拥有类似Python.Ruby和Smalltalk中的一些特性,可以作为Java平台的脚本语言使用 ... 
- 关于指针初始化为NULL的一些问题
			关于指针初始化问题,先看以下代码: #include <stdio.h>typedef struct{ char data[128]; int top;} Stack;voi ... 
- 使用containerlab搭建cilium BGP环境解析
			使用 Containerlab + Kind 快速部署 Cilium BGP 环境一文中使用Containerlab和Cilium实现了模拟环境下的Cilium BGP网络.它使用Containerl ... 
- Elasticsearch:IK中文分词器
			Elasticsearch内置的分词器对中文不友好,只会一个字一个字的分,无法形成词语,比如: POST /_analyze { "text": "我爱北京天安门&quo ... 
- 第二章:视图层 - 6:QueryDict对象
			类的原型:class QueryDict[source] 在HttpRequest对象中,GET和POST属性都是一个django.http.QueryDict的实例.也就是说你可以按本文下面提供的方 ... 
- PAT (Advanced Level) Practice 1003 Emergency 分数 25 迪杰斯特拉算法(dijkstra)
			As an emergency rescue team leader of a city, you are given a special map of your country. The map s ... 
- 洛谷P2880 [USACO07JAN] Balanced Lineup G(树状数组/线段树)
			维护区间最值的模板题. 1.树状数组 1 #include<bits/stdc++.h> 2 //树状数组做法 3 using namespace std; 4 const int N=5 ... 
- OnionArch - 如何实现更新指定字段的通用Handler
			博主最近失业在家,找工作之余,自己动手写了个洋葱架构(整洁架构)解决方案,以总结和整理以前的项目经验,起名叫OnionArch,其目的是为了更好的实现采用DDD(领域驱动分析)和命令查询职责分离(CQ ... 
- window安装MySQL 5.5教程
			window安装MySQL 5.5教程 1.官网下载MySQL 5.5 下载地址:https://dev.mysql.com/downloads/mysql/5.5.html#downloads 2. ... 
