转:一道笔试题-将int型数组强制转换为char*,再求strlen,涉及大小端
写出如下程序运行结果:
- #include<stdio.h>
 - #include<string.h>
 - int main()
 - {
 - int a[2000];
 - char *p = (char*)a;
 - for( int i = 0; i < 2000; i++)
 - a[i] = -1 - i;
 - printf( "%d\n", strlen(p));
 - return 0;
 - }
 
此乃网速科技2011校园招聘笔试题第一题,本人心里素质很不错,不过看到此题当时就懵了,哪有人这么写代码的,所以当时也没有做出来,后来运行以后也没有搞懂,刚刚吃饭,突然就明白了,特此记录、分享之。废话不多说,运行结果是:
1020
解析:
首先要明白负数在内存中的存储方式,还要知道int和char各占几位(都是最基本的啦)。这里很容易知道:
a[0] = -1 内存中应当是:11111111 11111111 11111111 11111111
a[1] = -2 内存中应当是:11111111 11111111 11111111 11111110
a[2] = -3 内存中应当是:11111111 11111111 11111111 11111101
……
a[255] = -256 内存中应当是: 11111111 11111111 11111111
当程序计算strlen(p)的时候遇到8个0就停止了(因为‘\0'的ascii码为0),strlen不包括’\0'.所以是255 * 4 + 3 = 1023.
为什么结果是1020呢?(PS:我的cpu是intel的,intel的cpu一般都是小端存储)这就涉及到内存的存储问题了。
众所周知,内存存储分为大端小端,大端就是我们人类理解的这样,将高位写在前面,将地位写在后面,小端存储则正好相反,所以a[255] = -256 在内存中的表示形式是: 00000000 11111111 11111111 11111111,这就是为什么答案是1020。当然了不同的机器会有不同,如果笔试的时候注明一下,应该效果会更好。
附判断大端小端的代码:
#include<stdio.h>
int check()
{
union check
{
int i;
char ch;
}c;
printf("%d\n" , &c.i);
printf("%d\n", &c.ch);
c.i =;
return (c.ch == );
}
int main()
{
int ret;
ret = check();
if(ret == )
{
printf("little\n");
}
else
{
printf("Big\n"); }
return ;
}
转自:http://blog.csdn.net/lalor/article/details/6863681
转:一道笔试题-将int型数组强制转换为char*,再求strlen,涉及大小端的更多相关文章
- C笔试题:将int型数组强制转换为char*,再求strlen,涉及大小端
		
1 #include<stdio.h> 2 #include<string.h> 3 int main() 4 { 5 int a[2000]; 6 char *p = (ch ...
 - Java中有关构造函数的一道笔试题解析
		
Java中有关构造函数的一道笔试题解析 1.详细题目例如以下 下列说法正确的有() A. class中的constructor不可省略 B. constructor必须与class同名,但方法不能与c ...
 - 一道笔试题来理顺Java中的值传递和引用传递
		
题目如下: private static void change(StringBuffer str11, StringBuffer str12) { str12 = str11; str11 = ...
 - 求int型数组和最大子数组  续
		
之前的博文里已经实现过该程序的构思.编译.运行,本次就不再重复与之相雷同的内容. 题目:与别人借组,借助求int型数组最大和子数组的问题,考虑大数溢出和int取值范围的问题 要求: 调试程序 当子数 ...
 - 一道笔试题和UML思想 ~
		
一句软件工程界的名言,让我想起了一个和一道笔试题有关的故事.希望更多的人了解 UML 背后的思想比他的语法更重要,是笔者写作本文的一点小愿望. 一.从一句软件工程名言说起 对很多事情的处理上,东西方都 ...
 - 由阿里巴巴一道笔试题看Java静态代码块、静态函数、动态代码块、构造函数等的执行顺序
		
一.阿里巴巴笔试题: public class Test { public static int k = 0; public static Test t1 = new Test("t1&qu ...
 - 一道笔试题:给定编码规则,实现decode()方法
		
public class CodeDecode { /*变换函数encode()顺序考察已知字符串的字符,按以下规则逐组生成新字符串: (1)若已知字符串的当前字符不是大于0的数字 ...
 - IGT一道笔试题
		
1到n连续的n个数 输入m 得出m个有序序列 比如 输入为n=5 ,m=3 则输出 543 542 541 532 531 521 432 431 421 321 当前长度为i,每个位上的取之范围为 ...
 - golang 中 string 转换 []byte 的一道笔试题
		
背景 去面试的时候遇到一道和 string 相关的题目,记录一下用到的知识点.题目如下: s:="123" ps:=&s b:=[]byte(s) pb:=&b s ...
 
随机推荐
- VC编程中如何设置对话框的背景颜色和静态文本颜色
			
晚上编一个小程序,涉及到如何设置对话框的背景颜色和静态文本颜色.这在VC6.0中本来是一句话就搞定的事.在应用程序类中的InitInstance()函数添加: //设置对话框背景和文本颜色 SetDi ...
 - UIPickView之自定义生日键盘和城市键盘
			
//// ViewController.m// 04-键盘处理// // #import "ViewController.h"#import "XMGProvince ...
 - Cocos2d_x的特点及环境配置
			
Cocos2d_x的特点: 什么是"x"?Cocos2d_x方式:有时候我们写的cpp文件扩展,CXX."X"标致着该项目是由c++,并提供c++中的API编写 ...
 - python下module、package导入
			
#encoding=utf-8"""模块:1.import demo #导入demo.py下的所有的函数,调用方法为:demo.function()2.from demo ...
 - .net 常用方法
			
1.String数组转换成Int数组 string[] strArr = "a,b,c".Split(','); int[] intArr = Array.ConvertAll& ...
 - 使用超链接跳转页面(GridView)
			
1. the html markup <div> <asp:GridView ID=" OnPageIndexChanging="GridView1_PageIn ...
 - XAlign - Xcode插件 - 对齐代码
			
链接地址:http://my.oschina.net/u/2473136/blog/520620 一款十分强大的自定义对齐模式插件 开源地址:https://github.com/qfish/XAli ...
 - easyui学习日记20141213
			
一.前言 对于页面的设计一直都不是很懂.看到easyui样式简洁大方的样子,就心里痒痒,趁这段时间工作没什么项目的同时充充电.同时给自己做个笔记吧. 首先需要下载easyui的包,有两种版本,支持GP ...
 - JS日历控件
			
<input type="text" id="st" name="st" onclick="return Calendar( ...
 - 转:requirejs:让人迷惑的路径解析(~~不错)
			
接触过requirejs的童鞋可能都知道,无论是通过define来定义模块,还是通过require来加载模块,模块依赖声明都是很重要的一步.而其中涉及到的模块路径解析,对于新手来说,有的时候会让人觉得 ...