写出如下程序运行结果:

  1. #include<stdio.h>
  2. #include<string.h>
  3. int main()
  4. {
  5. int a[2000];
  6. char *p = (char*)a;
  7. for( int i = 0; i < 2000; i++)
  8. a[i] = -1 - i;
  9. printf( "%d\n", strlen(p));
  10. return 0;
  11. }

此乃网速科技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,涉及大小端的更多相关文章

  1. C笔试题:将int型数组强制转换为char*,再求strlen,涉及大小端

    1 #include<stdio.h> 2 #include<string.h> 3 int main() 4 { 5 int a[2000]; 6 char *p = (ch ...

  2. Java中有关构造函数的一道笔试题解析

    Java中有关构造函数的一道笔试题解析 1.详细题目例如以下 下列说法正确的有() A. class中的constructor不可省略 B. constructor必须与class同名,但方法不能与c ...

  3. 一道笔试题来理顺Java中的值传递和引用传递

      题目如下: private static void change(StringBuffer str11, StringBuffer str12) { str12 = str11; str11 = ...

  4. 求int型数组和最大子数组 续

    之前的博文里已经实现过该程序的构思.编译.运行,本次就不再重复与之相雷同的内容. 题目:与别人借组,借助求int型数组最大和子数组的问题,考虑大数溢出和int取值范围的问题 要求: 调试程序  当子数 ...

  5. 一道笔试题和UML思想 ~

    一句软件工程界的名言,让我想起了一个和一道笔试题有关的故事.希望更多的人了解 UML 背后的思想比他的语法更重要,是笔者写作本文的一点小愿望. 一.从一句软件工程名言说起 对很多事情的处理上,东西方都 ...

  6. 由阿里巴巴一道笔试题看Java静态代码块、静态函数、动态代码块、构造函数等的执行顺序

    一.阿里巴巴笔试题: public class Test { public static int k = 0; public static Test t1 = new Test("t1&qu ...

  7. 一道笔试题:给定编码规则,实现decode()方法

    public class CodeDecode {     /*变换函数encode()顺序考察已知字符串的字符,按以下规则逐组生成新字符串:       (1)若已知字符串的当前字符不是大于0的数字 ...

  8. IGT一道笔试题

    1到n连续的n个数 输入m 得出m个有序序列 比如 输入为n=5 ,m=3 则输出 543 542 541 532 531 521  432 431 421 321 当前长度为i,每个位上的取之范围为 ...

  9. golang 中 string 转换 []byte 的一道笔试题

    背景 去面试的时候遇到一道和 string 相关的题目,记录一下用到的知识点.题目如下: s:="123" ps:=&s b:=[]byte(s) pb:=&b s ...

随机推荐

  1. HDU 3350 #define is unsafe

    题目大意:给定一个只含有MAX和+操作的式子,求加法运行了多少次,其中MAX使用宏定义. 题解:注意一个规律,对于MAX(A,B)其中A中加a次,B中加b次若A>B,则加a*2+b次,否则a+b ...

  2. BZOJ 1062

    program candy bzoj1062; ; maxm=; maxn=; var n,len,m,i,p,t,l,r,c,d,q:longint; s:..,..maxn,..maxm] of ...

  3. 统计难题(trie树)

    统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others)Total Submi ...

  4. 【网络协议】TCP中的四大定时器

    前言 对于每个TCP连接,TCP一般要管理4个不同的定时器:重传定时器.坚持定时器.保活定时器.2MSL定时器. 重传定时器 非常明显重传定时器是用来计算TCP报文段的超时重传时间的(至于超时重传时间 ...

  5. ORACLE 使用RMAN管理归档日志 archived log

    oracle 归档日志通常使用rman进行管理,作为备份集的一部分 正常情况下,可以根据方法删除 1 过期策略 crosscheck archivelog all; delete expired ar ...

  6. 大一C语言结课设计之《简单计算器》

    /*===============================================*\ ** 设计目的:简单计算器,计算形如10*(20.2-30.6)+5.0/2的表达式值 ** 简 ...

  7. 玩转Bootstarp(连载)

    一.Bootstarp是什么? 简单.灵活的用于搭建WEB页面的HTML.CSS.JS的工具集 (基于HTML5和CSS3) 总结:简洁强大的前端开发框架,可以让WEB开发更迅速.更简单 二.如何使用 ...

  8. plsql developer连接64位Oracle11g的解决方法

    1)安装Oracle 11g 64位 2)安装32位的Oracle客户端( instantclient-basic-win32-11.2.0.1.0)下载地址:http://www.oracle.co ...

  9. BZOJ 3907: 网格( 组合数 + 高精度 )

    (0,0)->(n,m)方案数为C(n,n+m), 然后减去不合法的方案. 作(n,m)关于y=x+1的对称点(m-1,n+1), 则(0,0)->(m-1,n+1)的任意一条路径都对应( ...

  10. CSS3 transform制作的漂亮的滚动式导航

    模拟这个做的 不过实现的没有别人那么好 http://www.creativetier.com/products/modern-menu-3/vertical.html 关于transform  看这 ...