这东西实际编程时一直无视的,范围小了就换个大点的表示形式,但是总觉得基础知识还是掌握得好,免得到时候用移位运算或类型转换或笔试题时要花时间想。

C语言的基本类型有char、int、float、double,另外还有说明符long、short、signed和unsigned。

首先要注意在不同操作系统中类型大小不一样,下面的情况只是考虑其中一种情况。

int和char均默认为signed,二进制的最高一位来表示符号,0为正1为负。

假如short int是16位,由于第1位表示正负,所以只剩15位表示实际数值,范围为-2^15到2^15-1

举例,按照原码表示:

0000 0000 0000 0101表示5

1000 0000 0000 0101表示-5

反码就是符号位不变,数值位取反,比如5就表示为0111 1111 1111 1010

但是这样问题来了,1000 0000 0000 0000跟0000 0000 0000 0000表示的都是0,这样0就有2种编码方式。

所以C语言采取了补码表示,1000 0000 0000 0000表示的是-2^15而非0。

补码:1、对于正数,补码与原码相同;2、对于负数,数值位的绝对值取反后在最低位加1。

因此,C语言中是用表示-5的是1111 1111 1111 1011

那么对负整数逐次进行自加运算得到结果如下

-4  1111 1111 1111 1100

-3  1111 1111 1111 1101

-2  1111 1111 1111 1110

-1  1111 1111 1111 1111

于是-1再自加后所有位数全部变为0,0的表示形式就变成了0000 0000 0000 0000,表示0的只有一种形式。

char在计算机内部是用一个字节的二进制来表示的,这里假定默认为signed,表示范围为-128到127。

对于char c = 128; c的二进制表示为1000 0000,如果转换成int输出是-127。

char转换成short int并不是说位数增加了,而是把它当成short int来解释,因此c还是1000 0000,表示的是-127,而不会因为转型为int就变成了0000 0000 1000 0000

看下面一段代码,signed转unsigned

int _tmain(int argc, _TCHAR* argv[])

{

char c = 128;

unsigned char cu = c;

short int i = cu;

cout << i;

return 0;

}

把c转换成unsigned char后,再转换成short int,那么输出的就是128,转型后还是1000 0000,但是按照unsigned的解释,最高位不再是符号位,而是数值位,所以结果就是2^8=128。

好了,再看下面一段代码,unsigned转signed

int _tmain(int argc, _TCHAR* argv[])

{

unsigned char cu = 255;

char c = cu;

short int i = c;

cout << i;

return 0;

}

255的unsigned表示为 1111 1111,转换为signed后,符号位1代表是负数,数值位转换成十进制后是127,按照补码的定义结果为-1。

以前用OpenCV处理图像时,经常被绕住,因为IplImage*的ImageData是char表示的,而处理图像时一般都转化成了unsigned char,回顾了补码的概念后那么下面这个对应就好理解了。

数值区间

[0,127]

[-128,-1]

char

x

x

unsigned char

x

256+x

c语言 int是signed,C语言的补码表示和unsigned及signed的的转换相关推荐

  1. C语言的补码表示和unsigned及signed的转换

    这东西实际编程时一直无视的,范围小了就换个大点的表示形式,但是总觉得基础知识还是掌握得好,免得到时候用移位运算或类型转换或笔试题时要花时间想. C语言的基本类型有char.int.float.doub ...

  2. c语言int转字符串_C语言零基础入门-指针-05

    C语言零基础入门-指针-05 本节要点: 1,字符指针. 2,字符串指针. 3,指针的参数传递 4,多重指针 01. 字符指针 这里的定义与前面的基本一样,所谓的字符指针就是这个指针指向的是一个字符型 ...

  3. c语言int x=3,C语言 设有 int x=11,则表示式((x++)*1/3)的值是几,为啥子

    C语言 设有 int x=11,则表示式((x++)*1/3)的值是几,为啥子以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下 ...

  4. C语言int search类型,C语言的一些高级议题

    指针是C语言的灵魂,我们经常听到这样的说法,当我们初学C语言的时候,似乎觉得也没有什么,但是当你越来越深入的了解它,你就会发现C语言的强大有时甚至超乎你的想象.C语言作为一种相对较为底层的语言,在某些 ...

  5. c语言int grade 5,C语言补考!!!

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include struct student { int id; char name[20]; int grade; }student ...

  6. c语言int转换为十六进制,C语言将int型数据转换为十六进制的字符串

    方法一: int i =0; char * inttohex(int aa,char *buffer) { if (aa < 16) //递归结束条件 { if (aa < 10) //当 ...

  7. c语言中整形变量,C语言基本数据类型:整型(int)用法详解

    1.整型int C语言提供了很多整数类型(整型),这些整型的区别在于它们的取值范围的大小,以及是否可以为负.int是整型之一,一般被称为整型.以后,在不产生歧义的情况下,我们把整数类型和int都称为整 ...

  8. C语言 unsigned与signed区别

    我们来一起看下,C语言中,对于Integer Type(整数形式)的unsigned与signed两种形式的区别,以及在内存中的存储方式是如何的 Integer type(整数形式)是C语言中的基本数 ...

  9. c语言int val,c语言不定参数与printf函数的实现

    今天学习了C语言不定参数,C语言中的不定参数主要靠这个头文件实现,这个头文件包含了va_list().va_start().va_end()三个宏,其用法为先声明一个va_list类型的变量,它用于访 ...

最新文章

  1. Valgrind使用说明
  2. Android中自定义xmlns
  3. CentOS6.5安装Subversion
  4. matplotlib练习
  5. python有效变量名_Python变量命名规则
  6. 廖雪峰 练习 把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字...
  7. 09.QT应用程序启动外部exe文件
  8. USB:收录比较好的USB协议讲解
  9. IntelliJ IDEA使用技巧(三)——Debug 篇
  10. VB6.0 组织json对象并生成json字符串
  11. GreenPlum学习笔记:split_part与string_to_array字符截取
  12. Tempo超进化,提效降本好帮手,工时管理小当家 Timewise
  13. 顺丰快递:请签收Netty灵魂十连问
  14. AI行为识别:安防主动预警
  15. WeWork入华 盈利奇迹能否复制
  16. 文字点选验证码再也不是难题,通过率 96% 的深度学习了解一下!
  17. Cesium 与百度全景API联动
  18. 同步卫星、静止卫星、近地卫星
  19. 计算机视觉和机器学习代码收集
  20. 使用MobLink点击链接打开app

热门文章

  1. 赛马网基本算法之--路灯
  2. python requests请求获得response返回的header信息
  3. 2022年全球市场智能户外摄像头总体规模、主要生产商、主要地区、产品和应用细分研究报告
  4. 私域给企业带来的7大优势
  5. 2022年湖北省中国专利奖申报条件以及认定流程(附奖项设置解析)
  6. 搭建velocity开发环境
  7. Mysqs查询账单-昨天每个用户最后一次交易的金额总和
  8. mybatis #{}和${}的区别
  9. 从零到五金冠,MG小象挤掉优衣库、Zara成女装第一
  10. shader冰冻效果