我们知道,在C语言中存在无符号数和有符号数(一些高级语言如Java里面是没有无符号数的),但是对于计算机而言,其本身并不区别有符号数和无符号数,因为在计算机里面都是0或者1,但是在我们的实际使用中有时候需要使用有符号数来表示一个整数,因此我们规定,当最高位为1的时,表示为负数,最高位为0时,表示为正数。

1:有符号数和无符号数在数值上的区别。

有符号数的最高位用来表示符号,所以在最大的数值上,有符号数的最大值小于无符号数。以一个字节为例:

有符号数的取值范围为:-128 — 0 — 127

无符号数的取值范围为:0 — 255

2:正数和负数的转换

转换关系为:负数(正数) = 正数(负数)的补码 + 1;

例如:

5  = 0000 0101

-5 = 1111 1011

实际的计算:

最大值 - 当前值 +1;

0xFF -5 +1 = -5(1111 1011)

0xFF -(-5) +1 = 5(0000 0101)

3:正负数在计算机中的存储

在计算机中,并不存在所谓正负,具体看下面的代码

int main(void)

{

int x = -1;

int i = 0;

unsigned int ux = (unsigned)x;

for(i = 0;i<32;i++)

{

ux = ux >> i;

if((ux & 0x01) == 0)

printf("%d = 1\r\n",i);

}

ux = (unsigned) x;

printf("ux = %d \n",ux);

printf("ux = %u \n",ux);

}

运行结果为:

111111111(32个1)

ux = -1

ux = 4294967295

原因是,当我们将 -1 通过强制类型转换赋值给ux时,此时ux变量所对应的地址,所存放的值是-1,也就是0xFFFFFFFF,也就是说,从存储的角度上讲,-1和4294967295在计算机的存储值都是0xFFFFFFFF,关键是你按怎样的方式去解析,

ux = -1;此时我们是按%d也就是有符号×××的方式去解析这个存储空间所对应的值,所以得到的解析结果是-1;

ux = 4294967295,此时我们是按%u也就是无符号×××的方式去解析这个存储空间的值,所以得到的最高位就是数值位,而不是符号位。

解析过程如下,这里假设int类型为一个字节(4个字节也是一样的原理,只是数值更大而已)权255-1

位值位值

11111

21212

41414

81818

16116116

32132132

64164164

12811281-128

所以

-1 = 1+2+4+8+16+32+64+(-128)

255 = 1+2+4+8+16+32+64+128

综上所述,计算机中的存储方式并不区分正负,关键在于程序员用什么方式去解析这块存储空间(地址)的值。

c语言中的无符号字节,C语言之有符号数和无符号数相关推荐

  1. c语言中精度站的字节,C语言学习--一些细节问题

    1.为什么指针站4byte? 在32bit系统中,指针占4byte;在64bit中指针占8byte: 解释:1.指针是int类型的,32bit中int是4byte的,所以指针是4byte的: 2.32 ...

  2. 小心c语言中的无符号类型-尤其是涉及到大小比较

    本文系转载:原文出处为 http://blog.csdn.net/max_min_go/article/details/10056955 不多说,说了都是累赘!直接看代码吧! 有兴趣的可以先猜猜结果是 ...

  3. C++中含有无符号类型的表达式——有符号数与无符号数相加

    首先,明确一个概念,什么是有符号数,什么是无符号数.以整型为例,int 类型的既可以表示正整数,又可以表示负整数,所以是有符号数.unsigned  int 只可以表示正整数,所以成类似的数为无符号数 ...

  4. C语言中的有符号数和无符号数之间转换

    C语言中的有符号数和无符号数之间转换 我们都知道C语言中有有符号数和无符号数两种整数表示方法,并且支持相互转换. 那么具体相互转换有什么规则,我们今天来了解一下: 在C语言中当声明一个像12345或0 ...

  5. java中有符号数和无符号数,C语言中无符号数和有符号数之间的运算

    C语言中有符号数和无符号数进行运算(包括逻辑运算和算术运算)默认会将有符号数看成无符号数进行运算,其中算术运算默认返回无符号数,逻辑运算当然是返回0或1了. unsigned int和int进行运算 ...

  6. C语言中 有符号数、无符号数、整数溢出

    #include<stdio.h> void main() {int l=-1;unsigned int c=135; printf("%u\n",l+c); } 这个 ...

  7. 【转+】C中的有符号数和无符号数之间的转换

    1. 在C语言中,数字常量如果没有后缀'U'或'u',则默认为是有符号数. 例: 其中1024和oxff这两个常量都是有符号数,这就意味着每个赋值操作包含了一个隐式的由有符号数到无符号数的类型转换. ...

  8. C中的有符号数和无符号数之间的转换

    1. 在C语言中,数字常量如果没有后缀'U'或'u',则默认为是有符号数. 例: [cpp] view plaincopy unsigned int n = 1024; unsigned int m  ...

  9. c语言中怎么转换类型数据类型,C语言中数据类型转换

    C语言的类型转换,可以分为两种:自动类型转换(隐式类型转换,有编译器帮你去完成)和强制类型转换(你知道自己想要什么,所以才转换). 对于自动类型转换,最常见的就是混合运算以及赋值运算,还有一种就是函数 ...

最新文章

  1. JAVA静态方法是否可以被继承 6,JAVA静态方法是否可以被继承?
  2. 计算机怎么恢复上一步,电脑怎么还原系统 电脑还原系统步骤盘点
  3. 计算机科技手抄报内容,科技手抄报内容云计算文字稿
  4. centos有趣软件包_这5个软件包使学习R变得有趣
  5. python 正则表达式过滤文本中的html标签 源代码解析
  6. cisco最经典书籍 下载(全CCIE们的结晶)转载资料
  7. 为什么办理房产证要经过开发商和物业?
  8. [转载] python字符串数组字典_Python:字符串、列表、元组、字典
  9. [POJ3274 Gold Balanced Lineup]
  10. “我是技术总监,你为毛总问我技术细节?”
  11. 移植oprofile到海思
  12. 吴昂雄回应Arm中国控制权争夺:Arm罢免我无效
  13. 十年里程碑 vivo X80铸造高端手机的主色调
  14. 三角函数计算,Cordic 算法入门
  15. 考研英语(一)——简单句
  16. NamingContainer取得 GridView的列数(RowIndex)、对应的资料表 这一列的主索引键
  17. ESP8266模块使用完整教程
  18. 2019-6浙江工业大学计算机学院转专业二志愿机试题目
  19. oracle 10092,Oracle诊断事件列表
  20. l05173芯片针脚图_汽车常见易损芯片

热门文章

  1. unity3d 人员控制代码
  2. Vlan中Trunk接口配置
  3. 源于十年来的点滴积累——《变革中的思索》印行出版
  4. 拨盘Demo大赛,获奖公布-20170710
  5. CAD库中列举所有航路点
  6. 【JSP笔记】第三章 JSP内置对象【上】
  7. 本地同时修改2个版本
  8. IOS自动化打包介绍
  9. 关于 CKEditor 3.6以后不兼容ie6的问题解决方案
  10. 赵丽词汇速记5500幻星笔记 (0、1)