fortran整数的位大小

问题描述 投票:0回答:1

我有以下程序给出一个我不理解的最小示例无论是一般的还是Fortran中的位表示。如果我使用gfortran 7.5ifort 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


fortran bit iso fortran95
1个回答
0
投票

来自电气工程的好朋友可以帮助我。

据我所知,有符号整数的符号编码为一位

通常不正确。

替代表示为:

https://en.wikipedia.org/wiki/Two%27s_complement

© www.soinside.com 2019 - 2024. All rights reserved.