位运算详解与实例
2011-11-08 20:07
218 查看
多字节转换为单字节
单字节转换为多字节
//理解清楚
实现a,b相加
///////////////////
输出:cba
请按任意键继续. . .
为什么会输出cba呢?
int a='abc';
编译器会将'abc'扩展为int,它的值为
6382179 即0x00616263
而intel int内存的实际存储格式是低位在前,所以实际a指向的内容为
0x63626100
如果按字串输出,正好是
cba
且正好是以\0结尾。
你的机器是小端,所以按照从小到大的顺序打印cba;因为你的int是4位,而abc是三位,所以可以正常输入和打印。
说的很透彻了,在little-endian的架构上上面的代码会输出cba,但是在big-endian的机器上就不会这样了。
所以这个题目要区别说明是大端还是在小端的机器上。
在小端的机器上结果是:cba
在大端的机器上结果是:abc
/*
字节对齐与大小端问题,参考http://blog.csdn.net/reiskie/article/details/1647605
*/
几个问题:
#include <stdio.h> int main() { //int data = 65793; int data = 16843009; char data_one = data & 0xff; data = data>>8; char data_two = data & 0xff; data = data>>8; char data_three = data & 0xff; data = data>>8; char data_four = data & 0xff; printf("%d\n",data_one); printf("%d\n",data_two); printf("%d\n",data_three); printf("%d\n",data_four); printf("LengthOfFloat = %d\n",sizeof(float));//4 printf("LengthOfDouble = %d\n",sizeof(double));//8 return 0; }
单字节转换为多字节
#include <stdio.h> int main() { //int data = 65793; int data = 16843011; char data_one = data & 0xff; data = data>>8; char data_two = data & 0xff; data = data>>8; char data_three = data & 0xff; data = data>>8; char data_four = data & 0xff; printf("%d\n",data_one); printf("%d\n",data_two); printf("%d\n",data_three); printf("%d\n",data_four); printf("LengthOfFloat = %d\n",sizeof(float)); printf("LengthOfDouble = %d\n",sizeof(double)); data = data_four<<24; data += (data_three<<16); data += (data_two<<8); data += data_one; printf("\n%d\n",data); return 0; }
//理解清楚
#include <stdio.h> int main() { //int data = 65793; int data = 16843011; char data_one = data & 0xff; data = data>>8; char data_two = data & 0xff; data = data>>8; char data_three = data & 0xff; data = data>>8; char data_four = data & 0xff; printf("%d\n",data_one); printf("%d\n",data_two); printf("%d\n",data_three); printf("%d\n",data_four); printf("LengthOfFloat = %d\n",sizeof(float)); printf("LengthOfDouble = %d\n",sizeof(double)); data = ( (data_four<<24) & 0xff000000 ); data += ( (data_three<<16) & 0x00ff0000 ); data += ( (data_two<<8) & 0x0000ff00 ); data += ( data_one & 0x000000ff ); printf("\n%d\n",data); return 0; }
实现a,b相加
#include <stdio.h> int sum(int a,int b) { if(a == 0) { return b; } else { return sum((a & b) << 1,a ^ b); } } void main() { printf("sum = %d\n",sum(123,456)); }
///////////////////
#include<stdio.h> int main() { int a='abc'; printf("%s\n",&a); //printf(&a); }
输出:cba
请按任意键继续. . .
为什么会输出cba呢?
int a='abc';
编译器会将'abc'扩展为int,它的值为
6382179 即0x00616263
而intel int内存的实际存储格式是低位在前,所以实际a指向的内容为
0x63626100
如果按字串输出,正好是
cba
且正好是以\0结尾。
你的机器是小端,所以按照从小到大的顺序打印cba;因为你的int是4位,而abc是三位,所以可以正常输入和打印。
说的很透彻了,在little-endian的架构上上面的代码会输出cba,但是在big-endian的机器上就不会这样了。
所以这个题目要区别说明是大端还是在小端的机器上。
在小端的机器上结果是:cba
在大端的机器上结果是:abc
/*
字节对齐与大小端问题,参考http://blog.csdn.net/reiskie/article/details/1647605
*/
#include<stdio.h> int main() { int a='abc'; int b=6382179; //'abc'扩展为int (IDE:VC6.0) printf("%02x\n",b); //VC6.0显示616263 printf("%s\n",&a); }
#include <stdio.h> #include <stdlib.h> int main(void) { int a = 'abc'; char *str = "cba"; int b; memcpy(&b, str, 4); printf("(char *)&a = %s\n", &a); printf("a 的 4 个字节(从高位到低位):%02x %02x %02x %02x\n" , (a >> 24) & 0xFF , (a >> 16) & 0xFF , (a >> 8 ) & 0xFF , a & 0xFF); printf("(char *)&b = %s\n", &b); printf("b 的 4 个字节(从高位到低位):%02x %02x %02x %02x\n" , (b >> 24) & 0xFF , (b >> 16) & 0xFF , (b >> 8 ) & 0xFF , b & 0xFF); return 0; }
几个问题:
#include <stdio.h> int main() { int a = 15,b = 2; a /= b + 1; int c = (1,2); printf("%d,%d\n",a,c);//5,2 return 0; }
相关文章推荐
- C语言 自增自减运算的区别详解及实例
- PHP高精确度运算BC函数库实例详解
- Oracle查询优化日期运算实例详解
- 前置++和后置++ 运算的详解及实例代码
- JavaScript中的逻辑运算符&amp;&amp;和||详解(运算法则、短路实例)
- Linux命令备忘实例(3)——数学运算
- linux iostat命令详解和使用实例(磁盘操作监控工具)
- thinkphp命名空间用法实例详解
- C++ MD5的源码实例详解
- 面向接口编程详解(二)——编程实例
- Bootstrap+PHP实现多图上传功能实例详解
- Java中位运算(移位、位与、或、异或、非) 的简单实例
- C# foreach循环实例详解
- PHP编写daemon process 实例详解
- Python字符串和字典相关操作的实例详解
- jQuery数组处理详解(含实例演示)
- jQuery源码分析之实例调用方法map,slice,first,last,end,sort,splice,push方法详解
- C# Timer用法及实例详解
- Jsoup 抓取页面的数据实例详解
- 二级缓存的配置及实例详解