Tag: 语言概念

为什么我们在C中有无符号和有符号的int类型?

我是C的初学者。 我最近了解了2’s Complement和其他表示负数的方法以及为什么2’s complement是最合适的。 我想问的是,例如, int a = -3; unsigned int b = -3; //This is the interesting Part. 现在,用于转换int类型 标准说: 6.3.1.3有符号和无符号整数 当具有整数类型的值转换为除_Bool之外的另一个整数类型时,如果该值可以由新类型表示,则它将保持不变。 否则,如果新类型是无符号的,则通过重复地添加或减去一个可以在新类型中表示的最大值来转换该值,直到该值在新类型的范围内。 第一段不能用作-3不能用unsigned int表示。 因此第2段开始发挥作用,我们需要知道unsigned int的最大值。 它可以在limits.h中找到UINT_MAX 。 这种情况下的最大值是4294967295因此计算结果如下: -3 + UINT_MAX + 1 = -3 + 4294967295 + 1 = 4294967293 现在4294967293二进制是11111111 11111111 11111111 11111101和-3 in 2的补码forms是11111111 11111111 11111111 11111101所以它们基本上是相同的位表示,无论我想要分配给无符号整数的负整数,它总是相同的。所以不是无符号类型冗余。 现在我知道printf(“%d” , […]

C对arrays的厌恶

在关于C的介绍性书籍中,经常声称指针或多或少是数组。 充其量只是一个巨大的简化吗? C中有一个数组类型,它的行为与指针完全不同,例如: #include int main(int argc, char *argv[]){ int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; int *b = a; printf(“sizeof(a) = %lu\n”, sizeof(a)); printf(“sizeof(b) = %lu\n”, sizeof(b)); return 0; } 给出输出 sizeof(a) = 40 sizeof(b) = 8 或者作为另一个例子, a = b会给出编译错误(GCC:“赋值给具有数组类型的表达式”)。 当然,指针和数组之间存在密切关系 ,在某种意义上说,数组变量本身的内容是第一个数组元素的内存地址,例如int a[10] = {777, 1, 2, […]