我有以下程序给出一个我不理解的最小示例无论是一般的还是Fortran中的位表示。如果我使用gfortran 7.5
或ifort 18.0
进行编译,它将通过所有断言,并且我不明白为什么。
[popcnt函数返回I的二进制表示形式中设置的位数('1'位)。
据我所知,有符号整数的符号被编码为一位,因此,如果我从popcnt(n)
转到popcnt(-n)
,它应该改变一个。如果我可以将n
表示为2的幂,则它的popcnt
应该为1或2(取决于符号)。我在思考中有什么错误?
program bit_sizes
use iso_fortran_env, only: int64
implicit none
integer(int64), parameter :: n = -4294967296_int64
call assert(2_int64 ** 32_int64 == -n)
call assert(popcnt(-n) == 1)
call assert(popcnt(n) == 32)
contains
subroutine assert(cond)
logical, intent(in) :: cond
if (.not. cond) error stop
end subroutine
end program