【C语言进阶】整型在内存中的存储(下)

简介: 【C语言进阶】整型在内存中的存储

2.unsigned和signed整型类的区别

先来一道题,通过题目来摸索!


char a= -1;


  原码:10000000 00000000 00000000 00000001


  反码:111111111  11111111  11111111 11111110


  补码:11111111 11111111 11111111 11111111(内存中存储方式:补码)


  但是char 占一个字节


 11111111


 要以%d输出,那么就会涉及整型提升。


                        整型提升的规则:与比自身类型低或者一些运算时,会发生整型提升


                        1.signed类型:正数提升时,补0;负数补1;(补当作最高位的符号位)


                        2.unsigned类型:提升时,直接补0;


那么,char a= -1,以%d输出时,整型提升时,


11111111


补后:11111111 11111111 11111111 11111111 存在内存中为补码,输出时要以原码输出


原码:10000000 00000000 00000000 00000001


(补码变原码,依旧是先取反(符号位不变!),再加一)


所以最终结果为 -1


signed char a = -1与char a = -1 是一样的。


在很多环境下,char,int都是有符号数!


所以结果还是 -1


unsigned char a = -1


  原码:10000000 00000000 00000000 00000001


  反码:111111111  11111111  11111111 11111110


  补码:11111111 11111111 11111111 11111111


  只取后面一个字节


 11111111


  整型提升(无符号数提升时补0 ):00000000 00000000 00000000 11111111(内存以补       码方式存储)


  最高位为0,是正数,正数原反补都相同,所以结果是  255.


一起来看结果

相信大家已经有所了解,并且熟悉了吧,当然还需要多多练习!

趁热打铁吧!

(%u为无符号输出)


原10000000 00000000 00000000 10000000


反11111111 11111111 11111111 01111111


补11111111 11111111 11111111 10000000


char 10000000


整型提升 11111111 11111111 11111111 10000000


结果 :4294967168

答案:-10


结果对了吗?


总结

     1.在内存中,不管是正数还是负数,存储形式都是以补码的形式存储!!


     2.一般情况下,int,char等整型通常是有符号数。


     3.大小端


          大端:数据的低位保存到了内存中的高地址处,数据的高位保存到了内存的低地址处


          小段:数据的低位保存到了内存中的低地址处,数据的高位保存到了内存的高地址处

目录
相关文章
|
3天前
|
C语言
C语言指针使用及动态分配内存
C语言指针使用及动态分配内存
6 0
|
3天前
|
C语言
C语言内存及堆栈操作
C语言内存及堆栈操作
10 0
|
3天前
|
C语言
C语言结构体传值和传址及内存使用
C语言结构体传值和传址及内存使用
6 0
|
5天前
|
存储 程序员 编译器
C语言:指针与内存
C语言:指针与内存
23 0
|
5天前
|
存储 编译器 C语言
C语言:内存函数
C语言:内存函数
|
5天前
|
存储 程序员 编译器
C语言:动态内存管理
C语言:动态内存管理
|
5天前
|
存储 编译器 C语言
C语言:数据在内存中的存储形式
C语言:数据在内存中的存储形式
|
13小时前
|
算法 C语言
C语言之函数递归篇
C语言之函数递归篇
8 0
|
13小时前
|
程序员 编译器 C语言
C语言之函数篇
C语言之函数篇
8 1
|
3天前
|
C语言 C++
C语言变量、地址、字符及printf()/sizeof()/scanf()函数介绍
C语言变量、地址、字符及printf()/sizeof()/scanf()函数介绍
4 0

热门文章

最新文章

相关产品

  • 云迁移中心