C/c++中移位与负数表达的一点研究
来源:互联网 发布:java 串口封装类 编辑:程序博客网 时间:2024/04/26 13:37
最近在项目开发过程中,遇到一些移位问题和有符号无符号转换时的表达问题,造成了种种的困惑。所以,个人抽出一点时间与之做了个彻底的了断。废话少说。切入正题.
来看一下代码:
int _tmain(int argc, _TCHAR* argv[]){char ch = 0x13;int value = ch << 8;value = ch << 16;value = ch << 24;value = ch << 32;return 0;}
你能说出每一步的value的值吗?
笔者之前一直认为,移位操作,左移就是将位左移,右补0;右移就是将位右移,左补零.(其中涉及算数移位与逻辑移位)。逻辑移位就是不考虑符号位,而算术移位需要考虑符号位.但是在将char左移32位时,预想的结果为0,但实际上是0x13.发生了循环移位,其并未丢掉移除的位进行补零操作。这与编译器有关吗?往达人指点.
总结几点:(1)移位操作 若不强制设定类型 默认为int 上例中会将ch转换为int
(2)移位过程中 若超出了int的范围 例如移位32为 则会发生循环移位 目前不确定是否与编译器有关
(3)有时根据需要需要考虑算术与逻辑移位操作
以上是移位 再看下面的负数表达问题
int _tmain(int argc, _TCHAR* argv[]){char ch = 0x13;int value = ch << 8;value = ch << 16value = ch << 24;value = ch << 32;__int64 l_value = ch << 62;__int64 l_value_0 = -0x4000000;return 0;}
其中 ch << 62位后 其值为0xc0000000 由于是按照int解析 所以其值 = -0x4000000 该值赋予__int64时 最高符号位为1 求反码后+1 最终得到0xffffffffc0000000;
l_value与l_value_0的值是相等的.
0 0
- C/c++中移位与负数表达的一点研究
- 关于C语言中负数的移位
- C语言负数的移位运算
- C语言负数的移位运算
- C/C++以及Java中移位的问题以及负数移位
- C/C++中static机制的一点研究
- 正数与负数的移位操作
- C语言中带负数的除法
- C语言中负数怎么表示的?
- C语言中数值的移位运算
- C语言:两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同(模除、移位)
- C语言中负数除法与右移取整问题
- C语言中负数除法与右移取整问题
- JAVA中,2进制的负数表达形式
- c语言中关于数组与指针的一点心得
- C语言中移位问题
- C语言中乘除法与移位关系
- C和PHP中while和for效率的一点研究
- javascripte 中的移位操作符
- TCP和UDP的区别
- join/inner join/left join/right join区别
- 么么哒第一篇
- 不要在finally块中处理返回值
- C/c++中移位与负数表达的一点研究
- Native关键字---小笔记
- HDU 3442 Three Kingdoms BFS + 优先队列
- 信息系统项目管理-题记
- Windows7虚拟盘(VHD)API
- LeetCode之Spiral Matrix
- Java面试宝典2014版
- DS1621在Linux下的IIC接口驱动设计
- the project file '' has been renamed or is no longer in the solution 解决办法