C位移注意

简介: 今天在看C语言缺陷和陷阱的时候,看到位移 也就是右移过程中空出来的位置 unsigned 使用0填充 signed 可能使用0填充和符号位填充, 如果关心填充位请使用unsigned, 但是我在另外一本书中看到为了避免可能的转换问题尽量使用signed,除非必...
今天在看C语言缺陷和陷阱的时候,看到位移
也就是右移过程中空出来的位置
unsigned 使用0填充
signed 可能使用0填充和符号位填充, 如果关心填充位请使用unsigned,
但是我在另外一本书中看到为了避免可能的转换问题尽量使用signed,除非必须使用unsigned,也许这就是必须的情况吧

而最大的可以位移数为 0到(位数-1)
比如int 就是 0-31是合法的   32 和 -1 都是不合法的,
使用GNU C
实验中,都报错
test.c:25:3: warning: right shift count is negative [enabled by default]
   a>>39;
确实如此,但是我们如果一次移动一位移动39次呢,这样就合法了。这里实验一下右移
左移始终用0填充,否则结果不正确了。但给出左移动的最大表示数 和程序

点击(此处)折叠或打开

  1. #include<stdio.h>




  2. int main(void)
  3. {
  4.         int a=1;
  5.         unsigned int b = 1;
  6.     int i;


  7.         for(i=0;i<50;i++)
  8.         {

  9.                 printf("%d\n",a);
  10.                 printf("%u\n",b);
  11.                 a<<=1;
  12.                 b<<=1;
  13.         }
  14. }


最后如下
.....
16777216
16777216
33554432
33554432
67108864
67108864
134217728
134217728
268435456
268435456
536870912
536870912
1073741824
1073741824
-2147483648   --signed   
2147483648    --unsigned
0
0
如果在移动都全部是0了最高位已经没有了。


下面是右移动主要看看是否使用符号位填充
程序:

点击(此处)折叠或打开

  1. #include<stdio.h>




  2. int main(void)
  3. {
  4.         int a=-2147483648;
  5.         unsigned int b = 2147483648;
  6.     int i;


  7.         for(i=0;i<50;i++)
  8.         {

  9.                 printf("%d\n",a);
  10.                 printf("%u\n",b);
  11.                 a>>=1;
  12.                 b>>=1;
  13.         }
  14. }




Hardware watchpoint 2: i==30
Old value = 0
New value = 1
0x000000000040057e in main () at test.c:20
20              for(i=0;i<50;i++)
(gdb) p &a
$1 = (int *) 0x7fffffffe9f4
(gdb) p &b
$2 = (unsigned int *) 0x7fffffffe9f8
(gdb) x/4bx &a
0x7fffffffe9f4: 0xfe    0xff    0xff    0xff
(gdb) x/4bx &b
0x7fffffffe9f8: 0x02    0x00    0x00    0x00
(gdb) 
可以看到有符号位的a确实使用了符号位进行了填充,因为是负数全部是符号位
0x7fffffffe9f4: 0xfe    0xff    0xff    0xff


输出结果最后为
......
-32
32
-16
16
-8
8
-4
4
-2
2
-1
1
-1
0
相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
相关文章
|
1月前
|
存储 缓存 算法
boxfilter盒子滤波
**Boxfilter** 是图像处理中的优化技术,通过积分图实现,将O(MN)复杂度的像素和、方差运算降至O(1)。不同于均值滤波,Boxfilter不计算像素均值,而是直接累加邻域像素值。该方法适用于快速计算局部特征,但不支持多尺度。通过滑动矩形模板并更新中间变量缓冲区,高效地完成滤波操作。
24 3
|
8月前
|
数据可视化 算法 vr&ar
位移贴图的实现原理
位移贴图在游戏开发、电影特效和产品可视化等领域得到广泛应用,能够增强模型的真实感和细节表现,提升图形渲染的质量和逼真度。
105 1
|
4月前
|
C++
字形变换(C++)
字形变换(C++)
13 0
|
6月前
时钟(分针和时针的重合问题)
时钟(分针和时针的重合问题)
39 1
|
7月前
|
存储 数据可视化 开发者
位移贴图和法线贴图的区别
位移贴图和法线贴图在原理、使用范围、精度和复杂度、生成方式以及存储方式等方面存在差异,开发者可以根据具体需求选择适合的贴图技术。
119 0
|
8月前
|
编译器
【逻辑位移和算数位移】
【逻辑位移和算数位移】
|
图形学
Unity 之 获取物体的旋转角正确数值
不管父物体如何设置,都能获取到物体本身旋转角度的正确数值
931 0
|
SQL 数据挖掘 Java
简单密码位移
简单密码位移
简单密码位移