Tag: 未签名

如何确定变量是已签名还是未取消

在C程序中,如果整数是有signed integer ,则最高位为1 ,否则为0 。 让我们使用char和unsigned char , signed char的范围是-128到127 , unsigned char是0到255 ,但实际上它们的hex在0x00到0xff范围内。 我现在的问题是,如果使用8位二进制数将char和unsigned char存储在内存中,计算机本身如何知道它是已signed还是unsigned ? char a = 0xff; printf(“%d”, a); //its result is -1. unsigned char a = 0xff; printf(“%d”, a); //its result is 255. 在上面的例子中, printf如何知道0xff的值是有符号还是无符号? 这只取决于a ?的定义?

将无效值赋给unsigned int时会发生什么?

可能重复: 签到C中的无符号转换 – 它总是安全吗? 假设我声明了一个unsigned int类型的变量: unsigned int x = -1; 现在-1的二进制补码(假设32位机器)是0xFFFFFFFF。 现在,当我将此值赋给x时,值0x7FFFFFFF是否已分配给x? 如果是这样,则printf(“%d”,x); 会打印十进制等效的0x7FFFFFFF,对吧? 但是,显然这没有发生,因为打印的值是-1。 我在这里想念的是什么? 编辑:我知道我们可以使用%u格式说明符来打印无符号值。 但这无助于回答上述问题。

为什么char的符号没有在C中定义?

C标准规定: ISO / IEC 9899:1999,6.2.5.15(第49页) char,signed char和unsigned char这三种类型统称为字符类型。 实现应将char定义为具有与signed char或unsigned char相同的范围,表示和行为。 确实gcc根据目标平台定义。 我的问题是,为什么标准会这样做? 除了可怕的和难以发现的错误之外,我看不到任何可能来自模糊类型定义的内容。 不仅如此,在ANSI C(C99之前)中,唯一的字节大小类型是char,因此使用char进行数学运算有时是不可避免的。 所以说“一个人永远不应该使用char来表示数学”并非如此。 如果是这种情况,更明智的决定是包括三种类型“ char , ubyte , sbyte ”。 有没有理由,或者它只是一些奇怪的向后兼容性问题,以便将坏(但常见)编译器定义为标准兼容?

使用%u和C中的%d打印内存地址之间的区别?

我读了一本C书。 要打印出变量的内存地址,有时书籍会使用: printf(“%u\n”,&n); 有时,作者写道: printf(“%d\n”,&n); 结果总是一样,但我不明白两者之间的差异(我知道%u表示无符号)。 有人可以详细说明吗? 非常感谢。