gpt4 book ai didi

c - 如何确定变量是有符号的还是无符号的?

转载 作者:太空狗 更新时间:2023-10-29 14:52:27 26 4
gpt4 key购买 nike

在使用 2 的补码整数的 C 实现中,如果有符号整数为负数,则最高位为 1 , 否则 0 .

我们取 charunsigned char , signed char 的范围是-128127unsigned char0255 , 但实际上它们的十六进制在 0x00 范围内至 0xff .我现在的问题是,如果 charunsigned char都是用8位二进制数存储在内存中,计算机自己怎么知道是不是signedunsigned

char a = 0xff; printf("%d", a); //its result is -1.
unsigned char a = 0xff; printf("%d", a); //its result is 255.

在上面的示例中,printf 是如何实现的?知道 0xff 的值是签名还是未签名?这是否仅取决于 a 的定义? ?

最佳答案

这里有很多相关的问题,比如this一个。

您的问题不太正确:对于 signed,最高位并不总是 1 —— 仅当值为负时。事实上,signedunsigned 是归因于完全相同的位模式的“类型”,以及这些位模式在比较或提升时如何解释由它们各自的类型定义。

例如:

unsigned char u = 0xFF; // decimal 255
signed char s = 0xFF; // decimal -1

您可以看到这两个值是如何相同的,都设置了最高位,但它们的类型不同。

编译器使用 type system知道如何解释值,程序员的任务是为值分配有意义的类型。在上面的示例中,我告诉编译器第一个 0xFF 应该被解释为一个 unsigned 值(另请参阅包含文件 limits.h ),最大范围为:

u = 0x00; // decimal 0, CHAR_MIN
u = 0xFF; // decimal 255, UCHAR_MAX

和第二个 0xFF 作为具有最大范围的 signed 值:

s = 0x00; // decimal 0, CHAR_MIN
s = 0x7F; // decimal 127, SCHAR_MAX
s = 0x80; // decimal -127, SCHAR_MIN (note how 0x7F + 1 = 0x80, decimal 127 + 1 = -127, called an overflow)
s = 0xFF; // decimal -1

对于您示例中的 printf,%d 告诉它需要一个 signed int 值。根据integer promotion rules of the C language较小的 char 类型是符号扩展(如果它是 signed 类型)或零扩展(如果它是 unsigned 类型)。以上面的例子结束:

printf("%d", u); // passes a int 0x000000FF, decimal 128, to the function
printf("%d", s); // passes a int 0xFFFFFFFF, decimal -1, to the function

更多 printf 格式说明符是 here ,例如 %u 在这种情况下您可能会感兴趣。

关于c - 如何确定变量是有符号的还是无符号的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22497382/

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