gpt4 book ai didi

C 和内存中的带符号字节表示

转载 作者:太空狗 更新时间:2023-10-29 14:49:57 24 4
gpt4 key购买 nike

有些东西我不明白:

C 中的 signed char 用 8 位表示:00000000

  • 0 是 0000 0000 => 0
  • 1 是 0000 0001 => 1
  • ...
  • 127 是 0111 1111 => 127

所以我认为第 8 位是符号位。所以我想:

  • 128 是 1000 0000 => 0
  • 129 是 1000 0001 => -1

但是没有!

试试这个:

int main(int argc, const char *argv[])
{
int i;
for (i = 0; i < 256; i++) {
printf("%3d = %d\n", i, (signed char)i);
}
return 0;
}

你得到:gcc -o tt tt.c ; ./tt |更多

  • ...
  • 126 = 126
  • 127 = 127
  • 128 = -128
  • 129 = -127
  • 130 = -126
  • 254 = -2
  • 255 = -1

怎么来的?

最佳答案

这称为有符号整数的 2 的补码表示,用于所有整数类型。

想法是这样的:CPU 中的加法器在发生溢出时简单地忽略并回绕,因此您实际上是在对数字的模环进行计算。所以,如果你从零减去 1,你会得到

 00000000 = 0
-00000001 = 1
--------------
11111111 = -1

等等。

这样,您的计算机就可以在计算时忽略符号。对于乘法也是如此,如本例中的 3 和 -2 的乘法(为简洁起见,4 位算术):

0011 * 1110
-----------
0000
0011
0011
0011
-----------
101010
truncated to 4 bits: 1010

10100110 的负数,即 6,所以结果应该是 -6。

只有很少的点需要考虑符号性,比如比较、除法和转换为更大的整数类型。比较相对简单,转换工作如下:

00000001 -> 0000000000000001
10000000 -> 0000000010000000 (unsigned extension 128 -> 128)
10000000 -> 1111111110000000 (sign extension, the sign bit is copied into all new bits, preserving the value of negative numbers -128 -> -128)

关于C 和内存中的带符号字节表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18013599/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com