在c中的unsigned short int中赋值为零

时间:2016-01-27 13:49:28

标签: c printf unsigned short format-specifiers

我尝试将零分配给名为list

的结构中的字段
list.ultimo = 0;

但是当我使用printf

printf("%d", list.ultimo);

我得到了结果

32766

但是当我添加

unsigned short int cero = 0;

printf的结果是正确的,无论不使用cero。为什么呢?

lista.h

#ifndef LISTA_H
#define LISTA_H

typedef struct{
  elemento lista[TAMANOMAX];
  unsigned short int ultimo;
}LISTA;

void Insertar(elemento, unsigned short int posicion, LISTA);
#endif

lista.c

#include<stdio.h>

typedef short int elemento;
#ifndef TAMANOMAX
#define TAMANOMAX 10
#endif
#include"lista.h"

void Insertar(elemento x, unsigned short int p, LISTA lista){
  if (lista.ultimo >= TAMANOMAX){
    puts("full list");
    printf("%hu",lista.ultimo); 
  }
}

的main.c

#include<stdio.h>

typedef unsigned short int elemento;
#define TAMANOMAX 4
#include"lista.h"

int main(){
  LISTA esferas;
  esferas.ultimo = 0; 
  Insertar(2,0,esferas);
  printf("\n%hu\n", esferas.ultimo);
  return 0; 
}

结果是

$gcc -Wall lista.c main.c

full list

32765

0

我是新手,我现在很慢,我后悔延迟

2 个答案:

答案 0 :(得分:2)

使用%hd打印short int%hu以打印unsigned short int%d适用于int

编辑:现在您已发布完整代码,TAMANOMAX中的10似乎设置为lista.c,但4中设置为main.c },导致main()函数与Insertar函数之间不兼容。您应该在所有文件中具有相同的值。如果您想使用不同的数组长度,请在length结构中添加LISTA成员。但TAMANOMAX在任何地方都应该完全相同,否则你实际上使用不同的数据类型,你的程序将无法正常工作。

答案 1 :(得分:1)

使用不匹配的格式说明符和参数类型调用undefined behavior

引用C11标准,章节§7.21.6.1,fprintf()函数

  

[..]如果有任何论据   不是相应转换规范的正确类型,行为是   未定义。

和约%d格式说明符

  

d,i
int参数[....]

因此,%d需要int

根据您的问题标题,ultimounsigned short int,您正在使用%d来打印该值。

您应该使用%hu来打印unsigned short int