编写一些代码,确定一个变量是有符号数还是无符号数(c专家编程摘录)

有一位同事在接受Microsoft面试时,其中一个题目就是“编写一些代码,确定一个变量是有符号数还是无符号数”。这实际上是一个相当难的问题,因为它留下了太多的空间让你去理解这个问题。有些人错误地把“有符号数”同“具有负号”等同起来,以为这个问题只需要一个小小的函数或宏,测试变量的值是否小于零就可以了。

问题自然没有这么简单。要回答这个问题,你必须在特定的编译器中确定一个给定的类型是有符号数还是无符号数。在ANSI C中,“char”既可以是有符号数,也可以是无符号数,这是由编译器决定的。当你编写的代码需要移植到多个平台时,知道类型是不是有符号数就非常有用了,如果该类型在所有的编译器编译时都是恒定的,那就再理想不过了。

你无法用函数实现目的。函数形式参数的类型是在函数内部定义的,所以它无法穿越调用这一关。因此,你必须编写一个宏,根据参数的声明对它进行处理。

接下来就是区别宏的参数到底是一个类型还是一个类型的值。假定参数是一个值,无符号数的本质特征是它永远不会是负的,有符号数的本质特征是对最左边一个位取补将会改变它的符号(比如2的补码表示,它肯定是个负数)。由于作为参数的这个值的其它位与这个测试无关,你可以对它们全部取补,结果是一样的。因此,可以像下面这样尝试:

#define ISUNSIGNED(a) (a >= && ~a >= 0)

如果宏的参数是一个类型,其中一个方法是使用类型转换:

#define ISUNSIGNED(type) ((type)0 - 1 > 0)

面试的关键就在于正确理解问题!你需要仔细地听,如果不理解问题或者觉得它的定义不清,可以要求一个更好的解释。第一个代码例子只适用于K&R C,新的类提升规则导致它无法适用于ANSI C。

Microsoft的绝大部分问题都想考察你在压力下能够怎样思考问题,但它们并不都是技术性的。


这是摘录自《c专家编程》的一段话,我觉得很有启发性。正确地理解问题是十分重要的,一不小心就会掉进陷阱中。

你可能感兴趣的:(面试,移植)