这个C代码用什么(无符号)和(长)强制转换

时间:2014-04-17 14:30:23

标签: c long-integer unsigned

做一些考试准备,这是一个过去的问题。

用具有相同功能的简单编程风格描述以下C部分的内容和重写内容。 (糟糕的缩进是问题的意图)。

关于A部分,我不确定未签名的演员对a做了什么。我已经测试了几次,似乎无法获得有意义的结果。

同样在B中我不知道while循环是如何使用长演员和!!是另一个问题

守则: //代码部分A

int f(int a,int b){
  return(((unsigned) a)>b);}

//代码B部分

int h(int *x, int y){
int * z= x-- +y; 
w=0;
while( (long) z-- ^(long) x) w += !!(*z);
return w;}

任何帮助将不胜感激,谢谢。

3 个答案:

答案 0 :(得分:2)

!!否定布尔表达式两次,实质上是将表达式值转换为01

与C一样,除零以外的所有值均为真,零表示为假,!!可用于将其转换为01,如果您需要使用稍后它在函数或表达式中不接受任何true值,只有数字1

关于其余部分:unsigned将您的int a的内部代表性从您的函数参数解释为unsigned int,因此例如-1变为4294967295编译器使用two's complement和4个字节的整数。

关于对long的投射:除非你完全知道自己在做什么,否则强烈建议在类似的情况下反对。在您的示例中,它将一些指针算法用于将指针解释为数值,基本上使用变量的地址,就好像它们只是数字一样。他们可能选择long,因为在他们的系统上它具有与指针完全相同的大小。并非所有系统都保证如此。

所以,对你的问题给出一个非常简短的答案:代码对undefined behavior表达{{3}},除了!!,如果表达式为零,它只给0,并且否则1

答案 1 :(得分:0)

运算符!是逻辑否定。

!true为false(0),!false为真(1)。

当一个值用作布尔值时,除了0(在很大意义上为0)之外的任何其他内容都为真; 0是假的。

因此,!!(*z)的值为01

如果0 *zNULL开头,则为1 如果*z不是NULL,则为{{1}}。

答案 2 :(得分:0)

!是没有的布尔运算符。

false为0,C中的true为1。

所以当你接受任何不是0的int时,你就跑了!在它上面,你将得到0(真为假),零将成为一。

所以!!的行动!将每个非零值更改为1,并将每个0更改为0。