前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >⭐️ 关键字深度剖析 ⭐️第三章(关键字sizeof\signed\unsigned&原反补\数据范围)

⭐️ 关键字深度剖析 ⭐️第三章(关键字sizeof\signed\unsigned&原反补\数据范围)

作者头像
用户9645905
发布2022-11-30 08:03:01
3210
发布2022-11-30 08:03:01
举报
文章被收录于专栏:Linux学习~

目录

前言

关键字-sizeof

关键字-signed\unsigned

有符号数vs无符号数

整形在内存的存储

原码、反码、补码

​十进制和二进制转换

大小端

什么是大端小端

为什么都是补码

深入理解变量内容的存入和取出

整形取值范围


前言


本文主要讲解点

  • 关键字sizeof的理解
  • 关键字signed\unsigned的理解
  • 掌握原反补概念
  • 深刻理解数据的取值范围

关键字-sizeof


  • 定义

用来确定一种类型对应在开辟空间的时候的大小(对内置字符和自定义数组是可求的)

注:不要将sizeof误认为函数,虽然sizeof带有(),但是sizeof是操作符,关键字

  • 示例
代码语言:javascript
复制
 int a=10;
 printf("%d\n", sizeof(a));
 printf("%d\n", sizeof(int));
 printf("%d\n", sizeof a);//这样写行不行?  可以
//得到的结果和sizeof(a)一致,说明sizeof并不是函数
 printf("%d\n", sizeof int);//err 求类型大小必须带上()
  • 与数组结合
代码语言:javascript
复制
int arr[3] = {1,2,3} 
sizeof(arr) 结果为12(arr表示整个数组) 
sizeof(arr+0)//或者sizeof(arr[0]) 结果为4(表示首元素地址)
//所有的地址大小为4(32位平台)/8(64位平台)

关键字-signed\unsigned


有符号数vs无符号数

代码语言:javascript
复制
char //字符数据类型
    unsigned char      //signed(有符号)/unsigned(无符号)
    signed char
//大多数编译器默认char为 signed char 即有符号类型(有的认为是unsigned char)
//对于 short int long 都认为是有符号类型
short //短整型
    unsigned short 
    signed short 
int //整形
    unsigned int
    signed int
long //长整型
    unsigned long 
    signed long

整形在内存的存储

变量的创建会在内存中开辟空间,而空间的大小根据类型来决定

原码、反码、补码

数据的表示有原码、反码和补码三种方法,均有符号位和数值位 符号位都是用0表示“正”,用1表示“负”(符号位依旧符合二进制运算)

  • 有符号数 

  • 正整数

原、反、补码都相同

  • 负整数

原码:直接将二进制按照正负数的形式翻译成二进制就可以 反码:将原码的符号位不变,其他位依次按位取反就可以得到了 补码:反码+1就得到补码

  • 无符号数

不需要转化,也不需要符号位,原反补相同

  • 对于整形来说

数据存放内存中其实存放的是补码 而数据的读取是使用原码

  • 示例:
代码语言:javascript
复制
//字面值转补码 
int a = 20; 
//20是正整数 
//原反补:0000 0000 0000 0000 0000 0000 0001 0100 

int b = -10;
 //-10是正整数 
//原:1000 0000 0000 0000 0000 0000 0000 1010 
//反:1111 1111 1111 1111 1111 1111 1111 0101 
//补:1111 1111 1111 1111 1111 1111 1111 0110 
代码语言:javascript
复制
//补码转源码 
方法一:先-1,在符号位不变,按位取反
方法二:将原码到补码的过程在来一遍

十进制和二进制转换

口诀: 1 后面跟 n 个 0 ,就是 2 的 n 次方

大小端

CPU访存的基本单位是字节  对于数据在内存存储补码时的字节排列顺序是有差异的(对于不同编译器) 数据按照字节,是有高权值位低权值为之分的;内存按照字节是有高地址,低地址之别的

什么是大端小端

大端:指数据的低位保存在内存的高地址中,而数据的高(权)位,保存在内存的低地址中 小端:指数据的低位保存在内存的低地址中,而数据的高(权)位,保存在内存的高地址中

为什么都是补码

使用补码,可以将符号位和数值域统一处理; 同时加法和减法也可以统一处理(CPU 只有加法器) 此外补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路(上面已经提到)

深入理解变量内容的存入和取出

代码语言:javascript
复制
signed int b = -10; 
//存:先转成补码
//原:1000 0000 0000 1010
//反:1111 1111 1111 0101
//补:1111 1111 1111 0110

unsigned int d = -10; //(是否合法?) 可以,存入与变量是否有符号无关
//存(补码):1111 1111 1111 0110
代码语言:javascript
复制
//存:字面数据必须先转成补码,在放入空间当中
//所以,所谓符号位,完全看数据本身是否携带+-号,和变量是否有符号无关! 

//取:以什么样的形式读取(打印)例:%d(有符号整型打印)%u(无符号整形打印)
//取数据一定要先看读取类型,然后才决定要不要看最高符号位
//如果不需要,直接二进制转成十进制;如果需要,则需要转成原码,然后才能识别
//当然,最高符号位在哪里,又要明确大小端

整形取值范围

  • 以char为例
代码语言:javascript
复制
unsigned char: [0,2^8-1] 
signed char : [-2^7, 2^7-1] //char等价

特定数据类型,能表示的数据取值范围(范围由多个连续数据构成),本质是多位比特位形成的排列组合的的个数

  • 如何理解-128
代码语言:javascript
复制
对于char类型来说(8bite)
0000 0000(表示0)(二进制转十进制)
0000 0001(表示1)
...
0111 1111(表示127)
1000 0001(表示-1)
...
1111 1111(表示-127)
but
1000 0000该表示什么?-0吗?计算机不会浪费任何一个空间
对于-128
原:1 1000 0000
反:1 0111 1111
补:1 1000 0000
存入时发生截断(存)补码:1000 0000
补码转原码时(发生截断):0000 0000
对于这种情况,1000 0000定义成为-128
这是一种半计算半定义的方式!
  • 总结规律

整数的取值范围(n表示类型占用多少bite) 无符号: [ 0 , 2 ^n - 1 ] 有符号: [ - 2 ^ ( n - 1 ), 2 ^ ( n - 1 ) - 1 ]

第四章传送门: ⭐️ 关键字深度剖析 ⭐️第四章(分支和循环关键字)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-07-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 关键字-sizeof
  • 关键字-signed\unsigned
    • 有符号数vs无符号数
      • 整形在内存的存储
        • 原码、反码、补码
      • 大小端
        • 什么是大端小端
        • 为什么都是补码
      • 深入理解变量内容的存入和取出
        • 整形取值范围
        相关产品与服务
        对象存储
        对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档