C语言的程序解释
我是c语言的新手,有时我会被我看到的东西弄糊涂。 我有以下代码:C语言的程序解释,c,pointers,C,Pointers,我是c语言的新手,有时我会被我看到的东西弄糊涂。 我有以下代码: int sstmm_() {time_t ourtime; time(&ourtime); return (int)(ourtime&0x00000fff); } 我不明白ourtime&0x00000fff的含义是什么? 它是指针吗?0x00000fff的规则是什么? 非常感谢你 & 在这里代表按位and运算,它与地址和指针无关&在这种情况下不引用的地址,就像您可能会混淆它一样,而是按位and
int
sstmm_()
{time_t ourtime;
time(&ourtime);
return (int)(ourtime&0x00000fff);
}
我不明白ourtime&0x00000fff
的含义是什么?
它是指针吗?0x00000fff
的规则是什么?
非常感谢你
&
在这里代表按位and运算,它与地址和指针无关
&
在这种情况下不引用的地址,就像您可能会混淆它一样,而是按位and
按位AND运算采用一个左侧参数和一个右侧参数,在位级别(即1s和0s)比较它们,并返回一个值,该值表示LHS和RHS中的哪些位置都有1。例如,比较6(二进制0110
)和3(二进制0011
)将得到二进制(0010
),以10为基数为2
展示我们的工作:
0110
0011
----
0010
第二个最右边的位置是两个值共用一个1的唯一位置,所以这是我们在按位和运算后得到1的唯一位置
由于该操作的右侧是0x00000fff
,因此该操作所做的是获取参数ourtime
,并仅返回最低有效12位(因为0xF
在基数2中是1111
)
再次展示我们的工作:
(ourtime has unknown 0s and 1s.)
00000000000000000000111111111111
由于右侧的最高有效20位为零,最低有效12位均为1,因此返回值显然是
ourtime
ourtime
的最低有效12位中的任何一位,它属于time\t
类型,通常是的typedef
\uuuu time\t
类型本身并不是我第一次接触ANSI C,标准说它代表自unix时代以来的系统时间,在类似linux的环境中,它通常是有符号整数,可能是32位或64位长
传统上是一个64位无符号整数。p>
所以,不,它不是指针,现在使用了-,如果你看到两边都是整数,那么它就意味着它被用作二进制运算符,如果你只看到它被用作一个变量,它被用作一元运算符。您应该检查一下ANSI C中的不同类型的运算符。许多编程语言都以类似的方式使用它们,但使用&作为一元运算符对于C/C++来说是典型的
&ourtime
正在评估ourtime
的地址。
ourtime&0x00000fff
要求最后3位整数ourtime
在类UNIX系统上,它给出一个介于0和4095之间的数字,te值每秒更改一次。@JonathanLeffler:为了澄清时间的分辨率\u t
取决于系统;12位整数的值为0到4095这一事实当然是普遍的。即便如此,我还没有遇到过这样一个系统,time\u t
不是以秒为单位的,不管它是否像Unix;如果不是这样的话,它将破坏许多做出这种假设的代码。@Clifford:不;在类UNIX系统上,POSIX将时间定义为一个具有1秒粒度的整数类型。这就是为什么有资格赛。我不是在评论其他系统类型。@JonathanLeffler:我认为我们在这一点上达成了激烈的一致——这是POSIX做出的保证,我认为它可能也是通用的,这只是一个旁注,而不是一个分歧。我的主要观点是,你的句子顺序相当于暗示0到4095的范围取决于系统。我在澄清依赖关系只适用于解决方案。好的。我懂了。很好。请您再解释一下好吗?ourtime&0x00000fff这个语句对ourtime的值和用十六进制表示的4字节长的值进行按位and运算,0x00000fff非常感谢