十六进制被截断

时间:2016-01-16 20:17:39

标签: c hex printf

为什么当我尝试打印argv的值时(根据Eclipse根据以下程序的特定运行0x7fffffffd958),我得到ffffd958而不是7fffffffd958 int main (int argc, char *argv[]) { printf("%x \n", argv); return 0; }

mask = tf.diag(tf.ones([n]))
y = tf.mul(mask,y)
cost = -tf.reduce_sum(y)

3 个答案:

答案 0 :(得分:2)

#include <stdio.h>

int main(int argc, char *argv[])
{
    printf("%p\n", (void*)argv);
    return 0;
}

这将处理指针类型的大小,而不是unsigned int的大小,它可能不相同。格式%p需要void*参数。

答案 1 :(得分:1)

长话短说:由于格式说明符错误,您正在调用未定义的行为。改为使用:

printf("%p \n", (void *) argv);

您获得不同值的原因是%xargv视为您平台上的32位无符号整数。您可能可能使用%lx(或可能%llx),但由于argv属于指针类型,因此仍然是错误且不正确的做法。

答案 2 :(得分:1)

使用%p打印void *是正确的,但%p的输出是实现定义的(所以它已记录在案),并且它在不同平台之间有所不同。特别是,某些平台会输出前导0x,有些则不会。我认为他们都使用十六进制,但即使这不是强制性的(printf()):

  

p参数应该是指向void的指针。指针的值是   转换为一系列打印字符,在实现定义中   方式。

另一种方法是使用<inttypes.h>中的C99设施:

printf("0x%08" PRIXPTR "\n", (uintptr_t)argv);

从技术上讲,uintptr_t是一种可选类型。在实践中,我不知道它不可用的系统(但是如果有例外,一些大型机或类似的计算机可能是候选者)。这允许您控制格式 - 我喜欢大写十六进制除了领先的0xFEDCBA987654321,因为它是均匀的高度,而0xfedcba9876543210ac的下降和e。 YMMV!