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包装类数 ...
随机推荐
- Bypass Windows Defender Dump Lsass(手法拙劣)
0x00.前言 Windows Defender是一款内置在Windows操作系统的杀毒软件程序,本文旨在记录实战环境中,服务器存在Windows Defender情况下转储凭证的渗透手法,技术简单粗 ...
- C/C++内存泄漏检测方法
1. 内存泄漏 内存泄漏(Memory Leak)是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果. 2. 检测代码 使用链 ...
- java8 新特性 -Optional的常见用法
1. Optional 一. 简介 Opitonal是java8引入的一个新类,目的是为了解决空指针异常问题.本质上,这是一个包含有可选值的包装类,这意味着 Optional 类既可以含有对象也可以为 ...
- 大根堆的pop&remove&initialize
1. 定义 [max(min) tree] 一棵树, 其中每个节点的值都大于 (小于) 或等于其 children (如果有) 的值. [max(min) heap] max(min) tree + ...
- 微服务低代码Serverless平台(星链)的应用实践
导读 星链是京东科技消金基础研发部研发的一款研发效能提升的工具平台,面向后端服务研发需求,尤其是集成性.场景化.定制化等难度不太高.但比较繁琐的需求,如服务前端的后端(BFF).服务流程编排.异步消息 ...
- 第一个Java代码的编写 :HelloWorld代码的编写
HelloWorld代码的编写 创建一个新的文件夹,通过Notepad++编写第一个Java程序 , 文件名为"Hello.java" 在文件中编写,如下代码: public cl ...
- 18个一线工作中常用的Shell脚本
1.检测两台服务器指定目录下的文件一致性 #!/bin/bash ###################################### 检测两台服务器指定目录下的文件一致性 ######### ...
- tcp_tw_recycle参数引发的系统问题
文章转载自: https://blog.csdn.net/zhuyiquan/article/details/68925707
- PostgreSQL 删除数据库
PostgreSQL 删除数据库可以用以下三种方式: 1.使用 DROP DATABASE SQL 语句来删除. 2.使用 dropdb 命令来删除. 3.使用 pgAdmin 工具. 注意:删除数据 ...
- Visual Studio 2022 开发 STM32 单片机 - 环境搭建点亮LED灯
安装VS2022社区版软件 选择基础的功能就好 安装VisualGDB软件(CSDN资源) 按照提示一步一步安装就好 VisualGDB激活软件(CSDN资源) 将如下软件放在VisualGDB的安装 ...