首页 > 编程语言 >算法与数据结构——基本数据类型与编码

算法与数据结构——基本数据类型与编码

时间:2024-08-22 17:26:11浏览次数:12  
标签:编码 反码 字节 补码 数据类型 0000 数据结构 原码

基本数据类型

基本数据类型是计算机CPU可以直接进行运算的类型,在算法中直接被使用,主要包括以下几种

  • 整数类型byteshortintlong
  • 浮点数类型floatdouble,用于表示小数
  • 字符类型char,用于表示各种语言的字母、标点符号甚至表情符号等。
  • 布尔类型bool,用于表示“是”与“否”判断。

基本数据类型以二进制的形式存储在计算机中。一个二进制位即1比特。在绝大多数现代操作系统中,1字节(byte)由8bite(bit)组成。

基本数据类型的取值范围取决于其占的空间大小,下面以Java为例。

  • 整数类型byte占用1字节=8比特,可以表示28个数字
  • 整数类型int占用4字节=32比特,可以表示232个数字

下表列举了各种基本数据类型的占用空间、取值范围和默认值。

类型 符号 占用空间 最小值 最大值 默认值
整数 byte 1 字节 -27(-128) 27 - 1(127) 0
short 2 字节 -215 231 - 1 0
int 4 字节 -231 231 - 1 0
long 8字节 -263  263 - 1 0
浮点数 float 4 字节  1.175 * 10-38 3.403 * 1038 0.0f
double 8 字节 2.225 * 10-308 1.798 * 10-308 0.0
字符 char 2 字节 0 216-1 0
布尔 bool 1 字节 false true false

字符char的大小在C和C++中为1字节。

基本数据类型提供了数据的“内容类型”,而数据结构提供了数据的“组织方式”。

 

数字编码

在前面的取值范围中,所有整数类型能够表示的负数都比正数多一个,例如bute的取值范围是[-128,127]。其原因涉及原码、反码、补码的相关知识。

  • 原码:我们将数字的二进制表示的最高位视为符号位,其中0表示正数,1表示负数,其余位表示数字的值。
  • 反码:正数的反码与其原码相同,负数的反码是对其原码除符号位外的所有位取反。
  • 补码:正数的补码与其原码相同,负数的补码是在其反码的基础上加1。

注意:数字是以“补码”的形式存储在计算机中的

原码(sign-magnitude)虽然最直观,但存在一些局限性。一方面,负数的原码不能直接用于运算。例如在原码下计算 1 + ( - 2),得到的结果是 - 3,这显然是不对的。

为解决此问题,计算机引入了反码。如果我们先将原码转换为反码,并在反码下计算 1 + (- 2),最后将结果从反码转换回原码,则可得到正确结果 -1。

另一方面,数字零的原码有 +0 和 -0 两种表示方式。这意味着数字零对应两个不同进制的二进制编码,这可能会带来歧义。与原码一样,反码也存在正负零歧义问题,因此计算机进一步引入了补码。下面是负零的原码、反码、补码的转换过程。

在负零的反码基础上加1会产生进位,但byte类型的长度只有8位,因此溢出到第9位的1会被舍去,这样,负零的补码为 0000 0000,与正零的补码相同。这意味着在补码表示中只存在一个零,正负从而得到解决。

注意:byte类型的取值范围是[-128, 127],多出来的一个负数-128是如何得到的?

我们注意到,区间[-127, +127]内的所有整数都有对应的原码、反码和补码,并且原码和补码之间可以互相转换。

然而,补码1000 0000 是一个例外,它并没有对应的原码。根据转换方法,我们得到该补码的原码为 0000 0000。这显然是矛盾的,因为该原码表示数字0,它的补码应该是自身。计算机规定这个特殊的补码1000 0000 就代表 -128。实际上(-1)+(-27)在补码下的计算结果就是 -128 。

事实上,计算机内部的硬件电路主要是基于假发运算设计的。这是因为加法运算相对于其他运算(比如乘法除法或减法)来说,硬件实现起来更简单,更容易进行并行化处理,运算速度更快。

 

 

标签:编码,反码,字节,补码,数据类型,0000,数据结构,原码
From: https://www.cnblogs.com/1873cy/p/18374171

相关文章

  • 算法与数据结构——数据结构的分类
    数据结构的分类常见的数据结构包括数组、链表、栈、队列、哈希表、树、堆、图,它们可以从“逻辑结构”和“物理结构”两个维度进行分类逻辑结构:线性与非线性逻辑结构揭示了数据元素之间的逻辑关系。在数组和链表中,数据按照一定顺序排列,体现了数据之间的线性关系;而在数中,数据从顶......
  • 集合及数据结构第八节(上)————栈(Stack)、栈的模拟实现和应用
    系列文章目录集合及数据结构第八节(上)————栈(Stack)、栈的模拟实现和应用栈(Stack)、栈的模拟实现和应用(上)栈的概念栈的使用栈的模拟实现栈的应用场景栈、虚拟机栈、栈帧的概念区分文章目录系列文章目录集合及数据结构第八节(上)————栈(Stack)、栈的模拟实现和应用......
  • 集合及数据结构第七节————LinkedList的模拟实现与使用
    系列文章目录集合及数据结构第七节————LinkedList的模拟实现与使用LinkedList的模拟实现与使用无头双向链表实现什么是LinkedListLinkedList的使用LinkedList的遍历ArrayList和LinkedList的区别文章目录系列文章目录集合及数据结构第七节————LinkedList的模......
  • 数据结构:栈、队列详解篇
    数据结构:栈、队列详解篇一、栈(一)栈的概念(二)栈的实现1、结构定义2、功能实现(1)栈的初始化(2)栈的销毁(3)栈的扩容(4)压栈(5)出栈(6)取栈顶元素、判空、栈的大小(三)例题分析1、有效的括号题目分析二、队列(一)队列的概念(二)队列的实现1、结构定义2、功能实现(1)队列结点生成(2)队列初始......
  • 数据结构链表入门指南 链表基本代码实现以及测试步骤
    链表介绍链表是一种数据结构,它由一系列节点组成,每个节点包含数据部分和指向下一个节点的指针。链表的基本特性包括:动态大小:链表的大小可以根据需要动态调整,不像数组那样需要事先定义固定大小。节点连接:每个节点通过指针连接到下一个节点,从而形成一个链状结构。灵活插入和......
  • Redis 数据类型详解
    Redis是一个开源的内存数据结构存储系统,广泛应用于缓存、消息队列、实时数据分析等场景。Redis提供了多种数据类型,本文将详细介绍Redis的五种主要数据类型及其应用场景,并从概述、基本操作、应用场景和数据结构等方面进行深入探讨。1.字符串(String)概述字符串是Redis......
  • MySQL 数据类型详解
    MySQL是一种广泛使用的关系型数据库管理系统,它支持多种数据类型以满足各种应用场景的需求。本文将详细介绍MySQL支持的数据类型、它们的使用场景以及实现原理,并通过图示帮助读者更直观地理解。目录简介数值类型整型浮点型定点型日期和时间类型字符串类型字符串二进制字......
  • 程序员如何平衡日常编码工作与提升式学习?
    在快速迭代的编程世界中,程序员们不仅需要高效完成日常编码任务,还需不断学习新技术、深化专业知识,以应对日益复杂的项目挑战。然而,如何在繁忙琐碎的编码工作与个人成长之间找到平衡,是不少程序员都面临的一个难题。是沉浸在日复一日的工作代码海洋中,还是抽出时间深入探索、自主学......
  • C++学习,数据类型
    编写程序时,需要使用各种变量来存储信息,变量是用于存储值的内存。创建变量时,在内存中保留了一些空间。存储各种数据类型的信息,如字符,宽字符,整数,浮点,双浮点,布尔等。根据变量的数据类型,系统分配内存并决定可以存储的内容。 内置类型C++提供了丰富的内置和用户定义的数据类......
  • MySQL基本数据类型
    MySQL数据类型MySQL中定义数据字段的类型对你数据库的优化是非常重要的。MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。数值类型MySQL支持所有标准SQL数值数据类型。这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以......