所以我只是在修补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;
}
答案 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,无论它是有符号还是无符号。