博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C位移注意
阅读量:6656 次
发布时间:2019-06-25

本文共 1392 字,大约阅读时间需要 4 分钟。

今天在看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

转载地址:http://nyato.baihongyu.com/

你可能感兴趣的文章
linux环境下安装jdk1.8
查看>>
mysql基础知识
查看>>
数据挖掘topic
查看>>
php xdebug 配置
查看>>
runtime的使用
查看>>
iOS开发 BOOL / bool / Boolean / NSCFBoolean
查看>>
js常用数值计算
查看>>
elasticsearch
查看>>
eclipse 插件管理和使用
查看>>
.Net 分布式云平台基础服务建设说明概要
查看>>
读《暗时间》一书,暗时间的8个方面和3种应对方法
查看>>
platform_driver_register( )过程追踪
查看>>
m0n0wall安装配置
查看>>
双向链表
查看>>
js string 验证
查看>>
搭建nfs服务的shell script
查看>>
一生的诠释改变你的一生
查看>>
WebInterface / Storefront访问加速
查看>>
centos6-5安装和配置cobbler-2-6实现自动化无人値守网络批量安装
查看>>
mysql基本命令之增删改查
查看>>