浅析无符号整型和有符号整型
来源:互联网 发布:软件外包管理 编辑:程序博客网 时间:2024/05/17 07:42
整型包括长整型(long),短整形(short),整型(int),字符型(char)。众所周知,char是字符类型。但其实char也是一个比较古怪的整型,长度为1字节 (默认是无符号类型)。
然后我们来解释一下有符号数和无符号数,首先我们要明白有符号和无符号都是针对二进制数来讲的,并且他们都是以补码的方式在计算机中存储的。
有符号数:用最高位最符号位,‘0’代表正数,‘1’代表负数,其余位用作数字位代表数值位。
无符号数:所有位都为数值位,无正负之分,亦无符号位。
之后我们在来瞧一瞧补码^_^
正数:原码,反码,补码都相同
负数:反码为除符号位外按位取反,补码为反码+1。
好了接下来我们看一下关于无符号和有符号的一些题
1.
int main(){ char a = -1; signed char b = -1; unsigned char c = -1; printf("%d %d %d", a, b, c);//a=-1 b=-1 c=255 system("pause"); return 0;}
这个题中的a和b应该比较好理解,但是c呢我们可以来算一下
1000 0001 -1的原码
1111 1110 -1的反码
1111 1111 -1的补码
当一个无符号1字节的整型%d输出时这就涉及到整型提升(即表达式中的字符和短整型操作数在使用之前被转换为普通整型(32bit))
那-1输出是个它前应加上它的符号位‘’(若在定义是为有符号数就要要加‘1’)
即输出 0000 0000 0000 0000 0000 0000 1111 1111
此时依据整型来说此数应是2^8-1=255
2.
char a = -128;printf("%u\n", a);//1111 1111 1111 1111 1111 1111 1000 0000
我们依旧来分析一下
首先我们先要知道这个-128在内存中是怎么存储的
char类型1个字节8个比特位若表示无符号数字的话是0000 0000~1111 1111 即0~255
但如果表示有符号数的话最高比特位应是符号位即
负数:1000 0000~1111 1111 即-128~-1 (我们规定1000 0000是-128)
正数:0000 0000~0111 1111 即0~127
我们再来看上面的这个题
1000 0000 -128
1111 1111 1111 1111 1111 1111 1000 0000 整型提升之后
按无符号整型十进制输出即4294967168
3.
char a = 128;printf("%u\n", a);
上面说道char能表示得有符号数字的范围是0~127和-128~-1
本题中显然仅靠char中的8个比特位已经不够表示128了我们可以借一位表示即
1 1000 0000 (此时最高位依旧表示符号位)
1111 1111 1111 1111 1111 1111 1000 0000(整型提升增加符号位后)
无符号整型是十进制输出依旧是4294967168
4.
int i = -20;unsigned int j = 10;printf("%d\n", i + j);//输出10
算一波!!!
1000 0000 0000 0000 0000 0000 0001 0100 -20的原码
1111 1111 1111 1111 1111 1111 1110 1011 -20的反码
1111 1111 1111 1111 1111 1111 1110 1100 -20的补码
0000 0000 0000 0000 0000 0000 0000 1010 10的补码 +
————————————————————————————
1111 1111 1111 1111 1111 1111 1111 0110 i+j的补码
1111 1111 1111 1111 1111 1111 1111 0101 i+j的反码
0000 0000 0000 0000 0000 0000 0000 1010 i+j的原码=10
5.
unsigned i;for (i = 9; i >= 0; i--){ printf("%u\n",i);}
此时我们会发现程序陷入了一个停不下来的情况,那这又是为什么嘞
我们一定要清楚i是一个无符号数是不可能为负数的所以条件是一定成立的所以是一个死循环
6.
char a[1000];int i;for (i = 0; i < 1000; i++){ a[i] = -1-i;}printf("%d", strlen(a));//255
再来看这个代码首先a是一个无符号的数组,无符号只能放入的数字范围是0~255所以在第一个数字-1(1111 1111)存入数组时数组会以为它是一个无符号数255存入,接下来-2(1111 1110)254,以此类推,在存入‘0’时strlen就找到了‘停止符’此时数组里存入了255~1,255个数字
7.
unsigned char i = 0;for (i = 0; i <= 255; i++){ printf("Hello World!\n");}
这个代码依旧是一个死循环
首先我们知道i是一个无符号数,范围是0~255,所以for循环里的条件是永远成立的,所以它会一直循环下去
好了花了一下午的时间写的这个,还是那句话,若是有人看到发现什么问题,希望你们不吝赐教,咱们一起学习一起进步么是吧~~^_^
- 浅析无符号整型和有符号整型
- 整型和短整型,有符号和无符号
- 无符号整型与有符号整型
- 有符号整型和无符号整型的计算
- 有符号和无符号整型的临界点
- 有符号和无符号整型数据溢出问题
- c语言中int什么意思以及什么是无符号和有符号整型
- 整型与无符号整型相加
- 无符号整型赋值陷阱
- 无符号长整型llu
- 无符号整型赋值陷阱
- 无符号整型赋值陷阱
- c++基本数据类型基本类型: 整型: 短整型: short int 整型: int 长整型:long int 字符型:char(分为有符号和无符号,默认有符号) 浮点型:
- 无符号变量转有符号变量 && C++整型赋值越界处理(VC++)
- 无符号整数赋值给有符号整型变量,注意数值范围
- 整型与无符号整型 运算时值的转换
- c语言之无符号整型
- 【面试题】海量数据 无符号整型
- ios-访问通讯录及Core Foundation和Foundation的桥接
- 用java在控制台打印日历格式
- 贪心:最优服务次序问题
- Xshell从服务器上传下载
- 真机调试,Could not launch
- 浅析无符号整型和有符号整型
- Tensorflow-gpu Ubuntu16.04 GTX1060 双显卡
- 一只半路出家的程序猴
- Net-snmp总结(一)-snmp的基本概念
- POJ
- 欢迎使用CSDN-markdown编辑器
- C++ 静态联编与动态联编
- 初窥Linux 之 我最常用的20条命令
- Intellij IDEA使用junit单元测试及其junit与spring版本不兼容问题