一道简单易错笔试题

#include<stdio.h>

int main(int argc, char* argv[])

{

char c=128;

printf("十进制c=%d\n",c);

printf("十六进制c=0X%0X\n",c);

return 0;

}

结果为

十进制c= -128;

十六进制c=0XFFFFFF80;

解析:

128的十六进制是0x80, 也就是2^7, 二进制看起来像这样:1000 0000 ,赋值给有符号数char c,其二进制不变。

但是小于sizeof(int)的整数在使用时其实都是扩展到sizeof(int)再计算的,对于有符号数扩宽填充符号位,这里char c=128的符号位是1,所以就是扩充了1111 1111 1111 1111 1111 1111 1000 0000,这样,打印%x时候,就是你看到的结果了。

这个扩宽是很正常的,并不会影响一个数值本身, 只是存储的字节变宽了而已。

符号位为1的二进制转十进制负数

①除去符号位减1;

②除去符号位,按位取反;结果就是负数的源码;

③源码转成相应的十进制。

因为符号位为1,所以被当做负数,而负数是以补码形式存在的,

所以其反码是1111 1111 1111 1111 1111 1111 1000 0000 - 1=1111 1111 1111 1111 1111 1111 0111 1111

原码是 1000 0000 0000 0000 0000 0000 1000 0000 转化为十进制是-128。

时间: 2024-11-05 11:56:20

一道简单易错笔试题的相关文章

一道简单的 Java 笔试题,但值得很多人反思

面试别人,对我来说是一件新奇事,以前都是别人面试我.我清楚地知道,我在的地域与公司,难以吸引到中国的一流软件人才.所以,我特地调低了期望,很少问什么深入的技术问题,只问一些广泛的.基础的.我只要最终给Leader一句“这个人技术还行/很好/非常好”,就行了.至于其它能力.综合水平,由别人把关.为此,在挑选唯一的一道笔试题时,我特别地上心. 首先,我不敢用网上那些广为流传的,比如Leetcode.<程序员面试宝典>里的题——这些都太难了!正儿八经做,其实很少有人能在1小时内完美做出来,除非之前遇

10道C++输出易错笔试题收集(敢进来挑战吗?)

下面这些题目都是我之前准备笔试面试过程中积累的,大部分都是知名公司的笔试题,C++基础薄弱的很容易栽进去.我从中选了10道简单的题,C++初学者可以进来挑战下,C++大牛也可以作为娱乐玩下(比如下面的第6题).为了便于大家思考,将题目与答案分开,不过无论题目本身如何,我觉得后面的解析过程更值得学习,因为涉及很多我们学习C++过程中必知必会的小知识点 . 第一部分:题目 如下函数,在32 bit系统foo(2^31-3)的值是:() int foo(int x) { return x&-x; }

10道C++输出易错笔试题收集

下面这些题目都是我之前准备笔试面试过程中积累的,大部分都是知名公司的笔试题,C++基础薄弱的很容易栽进去.我从中选了10道简单的题,C++初学者可以进来挑战下,C++大牛也可以作为娱乐玩下(比如下面的第6题).为了便于大家思考,将题目与答案分开,不过无论题目本身如何,我觉得后面的解析过程更值得学习,因为涉及很多我们学习C++过程中必知必会的小知识点 . 第一部分:题目 如下函数,在32 bit系统foo(2^31-3)的值是:() int foo(int x) { return x&-x; }

python 饥饿的小易(网易笔试题)

本周早些时候,学弟给我发了一道网易的笔试题,饥饿的小易,感觉有点意思-分享给大家 题目描述: 小易总是感觉饥饿,所以作为章鱼的小易经常出去寻找贝壳吃.最开始小易在一个初始位置x_0.对于小易所处的当前位置x,他只能通过神秘的力量移动到 4 * x + 3或者c.因为使用神秘力量要耗费太多体力,所以它只能使用神秘力量最多100,000次.贝壳总生长在能被1,000,000,007整除的位置(比如:位置0,位置1,000,000,007,位置2,000,000,014等).小易需要你帮忙计算最少需要

一道Realtek的C笔试题

上周五参加Realtek的笔试题,有一道选择题,大概是这样的: const char a1[] = "abc"; const char a2[] = "abc"; const char *p1 = "abc"; const char *p2 = "abc"; A.a1和a2一样,p1和p2不一样: B.a1和a2不一样,p1和p2一样: C.a1和a2不一样,p1和p2也不一样: D.a1和a2一样,p1和p2一样: 我在VS

一道非常易错的js面试题

题目如下: function Foo() { getName = function() { alert(1); }; return this; } Foo.getName = function() { alert(2); }; Foo.prototype.getName = function() { alert(3); }; var getName = function() { alert(4); }; function getName() { alert(5); } 请写出以下输出结果: Fo

一道阿里的在线笔试题

如需转载请留言. 题目如下: 有一个消息队列集群,集群里每台Broker的响应时间RT都不一样,但是每台Broker的极限服务QPS都是一样的,超过这个QPS会出现过载雪崩.而消息的生产者客户端,每次发送都会选择其中的一台broker来发送,一般来说发送逻辑是运行在一个线程池里面.假设cpu资源充足,通过实现一个负载均衡算法,使得生产者能够达到最大吞吐量,最优的平均响应时间,但是又不能把任何一台服务器压垮.已知每个broker的rt.极限qps,消息生产者的线程数量,请求总数,如果采用吞吐量最优

一道简单的HashMap面试题所想到的...

前言 看到一个JDK1.7和JDK1.8中关于HashMap的一个面试题: JDK1.7和1.8中HashMap中链表的插入的方式有什么不同? 原以为自己对HashMap的源码理解的还算可以了,应该足够应付面试了.但是看到这个问题自己确实也是懵逼了一下. 查了下资料,答案是JDK1.7是插入到首部,1.8改为了尾部. 既然有改变那么就想知道是为什么了,原因其实很简答,JDK1.7中经常面试会问 并发下put 为何会导致死循环? 其实这个死循环到了JDK1.8 就不会出现了,仅仅是因为 put的后

序列和-------一道大厂秋招笔试题

题目: 给出一个正整数N和长度L,找出一段长度大于等于L的连续非负整数,他们的和恰好为N.答案可能有多个,我我们需要找出长度最小的那个. 例如 N = 18 L = 2: 5 + 6 + 7 = 18 3 + 4 + 5 + 6 = 18 都是满足要求的,但是我们输出更短的 5 6 7 综合网上给出的参考答案,有两种相对简单,用python语言重写一下. 方法一:从数列的角度出发 解题思路:等差数列求和. 该题可理解为“一段长度大于等于L的等差数列之和等于N”的过程. S =L(a1+an) /