请原谅我这个问题.我寻找类似问题的答案,但我仍然对我的问题感到困惑.所以无论如何我会拍这个问题.我正在使用名为libexif的C库来处理图像数据.我在我的Linux桌面和MIPS板上运行我的应用程序(使用此库).对于特定的图像文件,当我尝试获取创建的时间时,我收到错误/无效值.在进一步调试时,我看到对于这个特定的图像文件,我没有按预期获得标记(EXIF_TAG_DATE_TIME).
该库具有多个实用功能.大多数功能的结构如下
int16_t
exif_get_sshort (const unsigned char *buf, ExifByteOrder order)
{
if (!buf) return 0;
switch (order) {
case EXIF_BYTE_ORDER_MOTOROLA:
return ((buf[0] << 8) | buf[1]);
case EXIF_BYTE_ORDER_INTEL:
return ((buf[1] << 8) | buf[0]);
}
/* Won't be reached */
return (0);
}
uint16_t
exif_get_short (const unsigned char *buf, ExifByteOrder order)
{
return (exif_get_sshort (buf, order) & 0xffff);
}
Run Code Online (Sandbox Code Playgroud)
当库试图调查原始数据中是否存在标记时,它会调用exif_get_short()并将返回的值赋给一个类型为enum(int)的变量.
在错误情况下,exif_get_short()应该返回无符号值(34687)返回一个负数(-30871),这会从图像数据中提取整个标记提取.
34687超出了最大可表示的int16_t值的范围.因此导致溢出.当我在代码中进行这种轻微修改时,一切似乎都运行正常
uint16_t
exif_get_short (const unsigned char *buf, ExifByteOrder order)
{
int …Run Code Online (Sandbox Code Playgroud) 考虑以下C程序:
#include <stdio.h>
int main(){
int a =-1;
unsigned b=-1;
if(a==b)
printf("%d %d",a,b);
else
printf("Unequal");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在该行中printf("%d %d",a,b);,"%d"用于打印无符号类型.这会调用未定义的行为吗?为什么?
有人可以解释为什么unsigned int取负值?一个unsigned int应该只正值.
来自维基百科:
单词,长,双字,长字,整数
无符号:从0到4,294,967,295,等于2 ^ 32 - 1
#include <stdio.h>
typedef unsigned int uint32;
int main()
{
uint32 i;
int x = -1;
i = x%32;
printf("\n\n Value of uint32 i = %d", i);
return (0);
}
Run Code Online (Sandbox Code Playgroud)
Value of uint32 i = -1
Run Code Online (Sandbox Code Playgroud)
以下是我在cpp标准中找到的解释,我无法解释.
对于每个有符号整数类型,存在相应的(但不同的)无符号整数类型:"unsigned char","unsigned short int","unsigned int"和"unsigned long int",每个占用相同的量存储并具有与对应的有符号整数类型40相同的对齐要求(3.9); 也就是说,每个有符号整数类型具有与其对应的无符号整数类型相同的对象表示.有符号整数类型的非负值范围是相应无符号整数类型的子范围,每个对应的有符号/无符号类型的值表示应相同.
4无符号整数,声明无符号整数,应遵守算术模2n的定律,其中n是整数特定大小的值表示中的位数
40)关于类型之间的对应关系以及指定它们的类型说明符序列,请参见7.1.5.2.
41)这意味着无符号算术不会溢出,因为无法由结果无符号整数类型表示的结果以比模式生成的无符号整数类型所表示的最大值大1的数量减少.