c语言 int是signed,C语言的补码表示和unsigned及signed的的转换
这东西实际编程时一直无视的,范围小了就换个大点的表示形式,但是总觉得基础知识还是掌握得好,免得到时候用移位运算或类型转换或笔试题时要花时间想。
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的的转换相关推荐
- C语言的补码表示和unsigned及signed的转换
这东西实际编程时一直无视的,范围小了就换个大点的表示形式,但是总觉得基础知识还是掌握得好,免得到时候用移位运算或类型转换或笔试题时要花时间想. C语言的基本类型有char.int.float.doub ...
- c语言int转字符串_C语言零基础入门-指针-05
C语言零基础入门-指针-05 本节要点: 1,字符指针. 2,字符串指针. 3,指针的参数传递 4,多重指针 01. 字符指针 这里的定义与前面的基本一样,所谓的字符指针就是这个指针指向的是一个字符型 ...
- c语言int x=3,C语言 设有 int x=11,则表示式((x++)*1/3)的值是几,为啥子
C语言 设有 int x=11,则表示式((x++)*1/3)的值是几,为啥子以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下 ...
- C语言int search类型,C语言的一些高级议题
指针是C语言的灵魂,我们经常听到这样的说法,当我们初学C语言的时候,似乎觉得也没有什么,但是当你越来越深入的了解它,你就会发现C语言的强大有时甚至超乎你的想象.C语言作为一种相对较为底层的语言,在某些 ...
- c语言int grade 5,C语言补考!!!
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include struct student { int id; char name[20]; int grade; }student ...
- c语言int转换为十六进制,C语言将int型数据转换为十六进制的字符串
方法一: int i =0; char * inttohex(int aa,char *buffer) { if (aa < 16) //递归结束条件 { if (aa < 10) //当 ...
- c语言中整形变量,C语言基本数据类型:整型(int)用法详解
1.整型int C语言提供了很多整数类型(整型),这些整型的区别在于它们的取值范围的大小,以及是否可以为负.int是整型之一,一般被称为整型.以后,在不产生歧义的情况下,我们把整数类型和int都称为整 ...
- C语言 unsigned与signed区别
我们来一起看下,C语言中,对于Integer Type(整数形式)的unsigned与signed两种形式的区别,以及在内存中的存储方式是如何的 Integer type(整数形式)是C语言中的基本数 ...
- c语言int val,c语言不定参数与printf函数的实现
今天学习了C语言不定参数,C语言中的不定参数主要靠这个头文件实现,这个头文件包含了va_list().va_start().va_end()三个宏,其用法为先声明一个va_list类型的变量,它用于访 ...
最新文章
- Valgrind使用说明
- Android中自定义xmlns
- CentOS6.5安装Subversion
- matplotlib练习
- python有效变量名_Python变量命名规则
- 廖雪峰 练习 把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字...
- 09.QT应用程序启动外部exe文件
- USB:收录比较好的USB协议讲解
- IntelliJ IDEA使用技巧(三)——Debug 篇
- VB6.0 组织json对象并生成json字符串
- GreenPlum学习笔记:split_part与string_to_array字符截取
- Tempo超进化,提效降本好帮手,工时管理小当家 Timewise
- 顺丰快递:请签收Netty灵魂十连问
- AI行为识别:安防主动预警
- WeWork入华 盈利奇迹能否复制
- 文字点选验证码再也不是难题,通过率 96% 的深度学习了解一下!
- Cesium 与百度全景API联动
- 同步卫星、静止卫星、近地卫星
- 计算机视觉和机器学习代码收集
- 使用MobLink点击链接打开app