c - 此 C 代码对 (unsigned) 和 (long) cast 做了什么

标签 c long-integer unsigned

<分区>

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

描述以下 C 代码的作用,并以简单的编程风格重新编写具有相同功能的代码。 (错误的缩进是问题的意图)。

关于 A 部分,我不确定 unsigned cast 对 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;}

如有任何帮助,我们将不胜感激。

最佳答案

!! 对 bool 表达式求反两次,本质上是将表达式值转换为 01

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

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

关于转换为 long :我强烈建议不要在类似情况下使用,除非您绝对知道自己在做什么。在您的示例中,它执行一些指针运算,将您的指针解释为数值,本质上是处理变量的地址,就好像它们只是数字一样。他们可能选择了 long,因为在他们的系统中它的大小与指针完全相同。不能保证在所有系统上都是如此。

因此,对您的问题给出一个非常简短的答案:代码执行 undefined behavior使用这些表达式,除了 !! 如果表达式为零则只给出 0,否则为 1

关于c - 此 C 代码对 (unsigned) 和 (long) cast 做了什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23135990/

相关文章:

javascript - 使用 ajax 更新元素直到 for 循环结束才生效

c - C中循环后如何返回值

java - 我应该将什么字符串传递给 java.lang.Long.parseLong() 以返回 NaN?

十六进制长整数字面量 "L"的C解释

sql - PostgreSQL 中数字之间的异或

c - 在 C 的 char 数组中存储无符号整数的问题

c - 手动编译并使用 make 链接后为 "File or folder not found"

c - c中的可用内存问题删除了链表中的某些值

c++ - 如何打开仅具有 FILE_READ_ATTRIBUTES 权限的文件?

c - 如果一个变量被声明为无符号,那么与其相关的函数也必须是无符号的吗?