为什么在打印此int时会得到相同的值?

时间:2010-10-22 20:31:07

标签: c gcc

所以我只是在修补C并希望看看我是否可以将二进制值分配给整数并使用printf()函数输出有符号或无符号值。但是无论我得到相同的输出,我都认为与无符号相比,打印签名的价值只有一半。我正在使用Code :: blocks和GCC。

printf()是否忽略%i& %u并使用变量定义?

示例代码:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    signed int iNumber = 0b1111111111111111;
    printf("Signed Int : %i\n", iNumber);
    printf("Unsigned Int : %u\n", iNumber);

    return 0;
}

如果我将int更改为unsigned:

,结果相同
#include <stdio.h>
#include <stdlib.h>

int main()
{
    unsigned int iNumber = 0b1111111111111111;
    printf("Signed Int : %i\n", iNumber);
    printf("Unsigned Int : %u\n", iNumber);

    return 0;
}

5 个答案:

答案 0 :(得分:6)

我认为charCount应为iNumber。两个程序都有未定义的行为,因为你使用了错误的转换说明符一次。

在实践中(对于大多数实现而言),printf依赖于您告诉它从堆栈弹出的内容;这是必要的,因为它是一个可变参数函数。 va_arg将类型弹出为第二个参数

分配前后的程序之间的位相同。所以printf指向具有不同类型指针的相同位。

%i%u获得相同结果的原因是最左边的位未设置,因此对于两个说明符都被解释为正数。

最后,您应该注意二进制文字(0b)是GCC扩展,而不是标准C.

答案 1 :(得分:3)

因为对于正数,大多数平台上的二进制表示在有符号和无符号之间是相同的。

答案 2 :(得分:2)

首先,您似乎正在打印一个名为charCount的内容,没有错误,并且b指定数字的方式不是标准C.我会检查以确定它是在做什么你认为是。对于指定类似位模式的标准方法,请使用八进制(数字以零开头)或十六进制(数字以零和x)格式开头。

其次,几乎所有计算机都具有相同的正整数及其无符号等价的二进制表示,因此没有区别。如果数字为负数则会有所不同,这通常取决于最重要的位。你的int可以是16位以上的任何大小,虽然在台式机,笔记本电脑或服务器上它很可能是32位,几乎肯定是32位或64位。

第三,printf()对传递给它的数据类型一无所知。当被调用时,它甚至无法知道其参数的大小,或者有多少。它从格式说明符派生出来,如果那些与传递的参数不一致,则可能存在问题。这可能是printf()最糟糕的事情。

答案 3 :(得分:0)

结果将仅对于高于0x7FFFFFFF的值有所不同,因为在几乎所有系统上,用于标记符号的权重最高的位。为了在CPU内部进行更快的计算,其他位被反转,因此0xFFFFFFFF为-1,0x80000000为-MAXINT-1,而0x7FFFFFFF为MAXINT。

答案 4 :(得分:0)

你可能有32位的整数。在这种情况下,这意味着您的iNumber的值为32767,无论它是有符号还是无符号。