什么是截断?

通俗一些来说,截断就是将一个长的整形变成一个短整形,在赋值时,长整形的数据中会有一部分没有空间存储,所以在短整形中只能存放低位的数据。

例如:

char a = 1;

此时1本身是int型数据,将1存储在char中,就发生了截断。

什么是提升?

提升又叫做整形提升,了解了截断的定义之后也不难猜到,提升就是将一个较短整形中的数据放到一个更长整型中。

大端机与小端机

在截断的定义中出现了一个词,叫低位数据,那么什么是低位的数据呢?

举个例子:

int i = 12345678;

此时的78就是低位的数据,而由于机器的不同,区分为了大端机和小端机,它们的存储方式也不同。

在大端机中,存储方式便与我们日常读数据一样,是从高位到低位来进行存储的,即: 12 34 56 78。

而在小端机中则不一样,它的存储方式为: 78 56 34 12,即从低位到高位存储。

那么如何判断自己是大端机还是小端机呢?

听起来好像好麻烦,其实不然,想通了会发现挺简单的

#include <stdio.h>
#include <stdlib.h>int BOS()
{int val = 1;//定义一个变量为1,此时十六进制为//0x00000001char ch = val;//类型转换if (ch)//在小端机中存储为0x01 00 00 00,前两位为01//则返回1,代表小端机{return 1;}else//大端机中存储为0x00 00 00 01,前两位为00,返回0{return 0;}
}int main()
{if (BOS())//判断结果返回的是1还是0,若1便进if,//若0便进else{printf("该机器是小端机\n");}else{printf("该机器是大端机\n");}system("pause");return 0;
}

下边提几个截断与提升的例子吧:

#include <stdio.h>
#include <stdlib.h>int main()
{char a = -128;//此处是截断,-128本身是int类型//原码是10000000 00000000 00000000 10000000//反码是11111111 11111111 11111111 01111111//补码是11111111 11111111 11111111 10000000//此时小端机中存储的是0x80 ff ff ff,截断时截取第一段,即80//即此时的a = 10000000printf("%u\n", a);//输出%u无符号整形时需要a从char提升为int//提升的规则是有符号数补符号位,无符号数补0,即为//11111111 11111111 11111111 10000000//所以此时输出应为2^32-127char b = 128;printf("%u\n", b);//b是一个正数,截断同上得到b = 10000000//但是此时注意提升时读的是自己的符号位,即为1,即全补1//输出同-128一致为 11111111 11111111 11111111 10000000unsigned char c = 128;printf("%u\n", c);//此时用了无符号整形unsigned,所以应补0,即为//00000000 00000000 00000000 10000000unsigned char d = -128;printf("%u\n", d);//-128截断后依然是10000000,无符号依旧补0//00000000 00000000 00000000 10000000system("pause");return 0;
}

还有一个例子,看似十分简单,算起来也确实挺简单,但是弄清楚其中运算的规则就没那么简单了。

#include <stdio.h>
#include <stdlib.h>int main()
{int i = -20;unsigned int j = 10;printf("%d\n", i + j);//i为有符号数,j为无符号数,当i与j相加时i需要提升为无符号//i原码为//10000000 00000000 00000000 00010100//反码为//11111111 11111111 11111111 11101011//补码为//11111111 11111111 11111111 11101100//i的原码为//00000000 00000000 00000000 00001010//相加得到//11111111 11111111 11111111 11110110//但输出时要求以%d的形式,即需要转为有符号,而看二进制得知符号位为1,需要转为原码//转反码需-1//11111111 11111111 11111111 11110101//取反//10000000 00000000 00000000 00001010//即为-10system("pause");return 0;
}

大端机,小端机;截断与提升相关推荐

  1. 使用C语言判断一个机器是大端机还是小端机

    1.什么是大端,什么是小端? 大端:数据的高位字节存放在低地址内,数据的低位字节存放在高地址内. 小端:数据的高位字节存放在高地址内,数据的低位字节存放在低地址内. 一个整型是4个字节,如:0x1a2 ...

  2. 大端机与小端机介绍及其判断(C)

    为什么会有大小端模式之分呢? 这是因为在计算机中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为 8 bit.但是在C 语言中除了 8 bit 的char之外,还有 16 bit 的 ...

  3. 大端和小端的判断及转换

    当前的存储器,多以byte为访问的最小单元,当一个逻辑上的地址必须分割为物理上的若干单元时就存在了先放谁后放谁的问题,于是端(endian)的问题应运而生了,对于不同的存储方法,就有大端(big-en ...

  4. 大端模式小端模式 主机序网络序

    1. 主机序 不同的CPU有不同的字节序类型这些字节序是指整数在内存中保存的顺序,这个叫做主机序.最常见的有两种: 1.         Little endian:将低序字节存储在起始地址. 即小端 ...

  5. 大端模式小端模式、主机序网络序、入栈地址高低问题

    一.大端模式&小端模式 所谓的"大端模式",是指数据的低位(就是权值较小的后面那几位)保存在内存的高地址中,而数据的高位,保存在内存的低地址中,这样的存储模式有点儿类似于把 ...

  6. C语言判断计算机存储是大端还是小端

    计算机的一个int型数据是用多个字节表示的,如果在内存中存放时标称该数据的地址中存放的是数据的最低字节,就叫小端机,反之把高字节存放在标称地址中的则称为大端机.所以可以定义一个int变量,将其地址强制 ...

  7. 使用c语言测试大端和小端,C语言*符号使用及大端法小端法测试

    工具:Microsoft Visual C++ 6.0 例子: int a = 1; int* b = &a; C语言规定a表示存储单元中的数据,&a表示存储单元的地址,b存储的就是a ...

  8. 整数中内存中的保存方式:大端、小端

    一个数在计算机内存中的保存方式是大端法表示还是小端法表示? 首先C++当中并没有规定我们这个内存中,整数在内存中是采用大端法还是小端法表示.所以在编写程序的时候这一点并不是很重要. 但是如果编写一个程 ...

  9. 网络通信之 字节序转换原理与网络字节序、大端和小端模式

    一.在进行网络通信时是否需要进行字节序转换? 相同字节序的平台在进行网络通信时可以不进行字节序转换,但是跨平台进行网络数据通信时必须进行字节序转换. 原因如下:网络协议规定接收到得第一个字节是高字节, ...

最新文章

  1. linux权限切换命令,Linux基础常用命令汇总(权限操作)
  2. 【ORACLE 高可用】 作业 :配置ORACLE GoldenGate 1
  3. 790页微软官方《.Net核心编程》高清版PDF,提供下载
  4. fileinputstream读取文件_压缩 20M 文件从 30 秒到 1 秒的优化过程
  5. 有关计算机利弊的英语作文,急需一篇有关电脑优缺点的作文(英文的)
  6. Log4j介绍,log4j.properties配置详解
  7. Android Studio中R无法找到res/raw文件夹
  8. Mac配置adb笔记,彻底解决zsh: command not found: adb问题
  9. java比较两个对象_Java比较两个对象
  10. Android 时间选择器 PickerView,的详细使用
  11. 2012写给自己的年度总结
  12. Windows文件同步
  13. 小觅相机SDK安装与报错解决
  14. 小米助手android6版本暂未支持,小米助手连接不上小米5怎么办 小米助手显示不支持安卓6.0连接不上小米5解决方法...
  15. hnu 模型机组合部件的实现(一)
  16. 人工智能革命,是创造就业还是摧毁就业?
  17. html基础笔记与html5代码展示
  18. 计算机的英语作文模板,高中英语作文模板 第243期:My Computer 我的电脑
  19. 2010计算机试题答案,2010全国计算机等级考试试题与答案公布
  20. ros 双wan配置_5G智慧路灯杆网关的双WAN口应用介绍

热门文章

  1. python执行Linux系统命令
  2. 使用pandas 按同一列名称合并,并解决concat() got an unexpected keyword argument ‘join_axes‘报错
  3. python/正则 从字符串中提取数字
  4. 机器学习数据预处理代码汇总(最新更新20年3月1日)
  5. mysql表增加一行_数据库表增加一行数据
  6. python串口模块_Python使用pip安装pySerial串口通讯模块
  7. 多线程怎么保证数据安全_Python threading实现多线程 提高篇 线程同步,以及各种锁...
  8. 快手用计算机说唱的叫什么,HIPHOP人物:“我们呢说唱,会在快手上爆炸!”
  9. PCM data flow - 6 - 声卡和PCM设备的建立过程
  10. Padrino 生成器指南